私はNASMファイルとCファイルを持っています。私のOSはUbuntu 17.04 64ビットリンクCとNASMと64ビット
私は別の投稿からの指示に従っています。
#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
コンパイル:Linking C with NASM
ここに私のコードは
main.cのだ
[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ビットのASM
問題は規則を呼んでいます。 System 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つのレジスタを追加して3番目にセーブするトリックは 'lea rax、[rdi + rsi]' –