我有一個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]' –