将参数从C传递到汇编

时间:2016-06-02 02:07:13

标签: c linux assembly 64-bit x86-64

我试图在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 )。但是我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

您可能会混淆使用哪种调用约定。

Linux使用64位System V调用约定。根据这种约定,对于传递INTEGER类型参数,寄存器在堆栈上是非常优选的。整数传递的寄存器按以下顺序使用:

  • %RDI
  • %RSI
  • %的RDX
  • %RCX
  • %R8
  • %R9

如果使用其他Integer参数,它们将在堆栈上传递。

您可以在{{3}}。

中找到详细信息