У меня есть файл 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-битного ассемблера
Выпуск соглашение о вызове. 64-битный ABI System V можно найти [здесь] (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 параметра, было бы так же просто, как «добавить rsi, rdi'' mov rax, rsi'' ret». Трюк для добавления 2 регистров и сохранения в третий будет «lea rax, [rdi + rsi]» –