【发布时间】:2016-12-03 10:54:05
【问题描述】:
我有一个 NASM 文件和一个 C 文件。我的操作系统是 Ubuntu 17.04 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
编译:
home@main:~/Desktop/TEST$ nasm -f elf64 doit.asm && gcc -Wall main.c doit.o
home@main:~/Desktop/TEST$ ./a.out 318503633
home@main:~/Desktop/TEST$
如您所见,结果甚至与预测结果相差无几,即 6
请告诉我为什么结果与 32 位 asm 不同
【问题讨论】:
-
问题是调用约定。 System V 64 位 ABI 可以是 found here 。 第 3.4.3 节 中介绍了参数传递。前 6 个整数类参数通过寄存器 RDI、RSI、RDX、RCX、 传入R9 和 R8 的顺序。 RAX 中返回整数类结果。图 3.4 还显示了哪些寄存器需要由函数保存。添加 2 个参数就像
add rsi, rdimov rax, rsiret一样简单。添加 2 个寄存器并保存到第三个的技巧是lea rax, [rdi+rsi]
标签: c assembly parameters nasm x86-64