如何解决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,它具有在寄存器RDI
,RSI
,RDX
,{{1}中传递的前6个“常规”参数。 },RCX
,R8
。进入时,R9
在a
中,而RDI
在b
中。
对于RSI
来说,这简化了代码,因为您无需从堆栈指针的偏移量中进行加载。
swap
请注意,这不一定是最低级别的最有效交换方法。即使指令更少,但这并不一定会更好,并且在性能方面会更差。 GCC 10 for x86-64生成加载到寄存器的内容,然后将二者翻转存储。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。