x86-64组件中的交换功能

问题描述

我正在尝试编写以下形式的函数:

void swap(int * a,int * b);

在x86-64程序集中。

[section .text]
global  swap ;
swap: mov ecx,[esp+8] ; copy parameter a to ecx
mov edx,[esp+16] ; copy parameter b to edx
mov eax,[ecx] ; copy a into eax
xchg eax,[edx] ; exchange eax with b
mov [ecx],eax;
ret;

我在Linux上使用以下命令对此进行编译:

nasm -f elf64 swap.asm

它编译没有任何错误。主文件如下:

 #include <stdio.h>
 extern void swap(int *a,int *b);
 int main(){
          int a = 10,int b = 20;
          swap(&a,&b);
          printf("a = %d b = %d\n",a,b );
          return 0;
 }

主文件也会编译。但是,运行此程序时出现分段错误。有什么想法我犯错了吗?

解决方法

简短的回答:您期望使用错误的调用约定。您还将使用32位指针而不是64位指针。


Linux x86-64应用程序使用System V AMD64 ABI,它具有在寄存器RDIRSIRDX,{{1}中传递的前6个“常规”参数。 },RCXR8。进入时,R9a中,而RDIb中。

对于RSI来说,这简化了代码,因为您无需从堆栈指针的偏移量中进行加载。


swap

请注意,这不一定是最低级别的最有效交换方法。即使指令更少,但这并不一定会更好,并且在性能方面会更差。 GCC 10 for x86-64生成加载到寄存器的内容,然后将二者翻转存储。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...