我试图在C中创建一个使用Assembly函数的程序。您可以在下面看到代码:
sum_c.c
#include <stdio.h>
extern int _assemblySum(int x, int y);
int main(int argc, char *argv[]){
int total;
total = _assemblySum(4, 2);
printf("%d\n", total);
return 0;
}
assembly_Sum.asm
SECTION .DATA
SECTION .TEXT
GLOBAL _assemblySum
_assemblySum:
push rbp
mov rbp, rsp
mov rax, [rbp+16]
mov rbx, [rbp+24]
add rax, rbx
pop rbp
ret
COMPILE
nasm -f elf64 assembly_sum.asm -o assembly_sum.o
gcc c_sum.c assembly_sum.o -o sum
./sum
当我运行程序时,我得到的随机数字如-1214984584或2046906200.我知道我需要使用寄存器rdi,rsi,rdx和rcx,因为64位GNU / Linux编译器使用它们(Passing arguments from C to 64bit linux Assembly )。但是我该怎么做呢?
答案 0 :(得分:1)
您可能会混淆使用哪种调用约定。
Linux使用64位System V调用约定。根据这种约定,对于传递INTEGER类型参数,寄存器在堆栈上是非常优选的。整数传递的寄存器按以下顺序使用:
如果使用其他Integer参数,它们将在堆栈上传递。
您可以在{{3}}。
中找到详细信息