我有一个NASM文件和一个C文件。我的操作系统是Ubuntu 17.04 64位链接C与NASM在64位
我按照其他帖子的指示。 Linking C with NASM
这里是我的代码
的main.c:
#include <stdio.h>
int doit(int a, int b);
int main()
{
printf("%d\n", doit(2,4));
return 0;
}
doit.asm:
global doit
section .data
section .text
doit:
xor rax, rax ;sets rax to 0
mov eax, [rsp+8] ;sets **b** to eax(32bit = int size)
add eax, [rsp+16] ;adds **a** to eax(32bit = int size)
ret
编译:
[email protected]:~/Desktop/TEST$ nasm -f elf64 doit.asm && gcc -Wall main.c doit.o
[email protected]:~/Desktop/TEST$ ./a.out 318503633
[email protected]:~/Desktop/TEST$
正如你所看到的,结果甚至不是接近预测的结果,这是6
请告诉我为什么是从32位汇编结果不同
的问题调用约定。系统V 64位ABI可以[在这里找到](https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-r252.pdf)。参数传递在_3.4.3_节中介绍。前6个整数类参数依次通过寄存器_RDI _,_ RSI _,_ RDX _,_ RCX _,_ R9_和_R8_传入。整数类结果返回_RAX_。图3.4还显示了哪些寄存器需要通过函数来保存。添加2个参数就像'add rsi,rdi''mov rax,rsi'' ret'一样简单。添加2个寄存器并保存到第三个寄存器的技巧是''rax,[rdi + rsi]' –