2013-03-02 84 views
2

虽然我学习x64程序集,但我试图使add方法添加两个整数并使用程序集返回整数。 我曾与x86的工作代码,我试图转换为x64程序集:将x86代码转换为x64的简单例子

只是我改变了寄存器的名称是x64和生成的对象文件没有错误,但当我在我的C函数中使用它,我总是得到sum = 0.

我认为参数位置存在问题,我没有找到这样的问题的好文档。

section .text 
    global addi 
addi: 
    push rbp 
    mov  rbp, rsp 
    mov  rax,[rbp+12] 
    mov  rdx,[rbp+8] 
    add  rax, rdx 
    pop  rbp 
    ret 

回答

3

X86-64具有由AMD定义的调用转换,所有的工具链,这个平台应该遵循这样的:

  • 第一个参数 - > RDI
  • 2日 - > RSI
  • 3日 - > RDX
  • 4日 - > RCX
  • 5日 - > RAX

所以守ld看起来像:

section .text 
    global addi 
addi: 
    mov rax, rsi 
    add rax, rdi 
    ret 
+1

实际上,这个调用约定不适用于x86_64_in general_,而是适用于类SystemV系统(Linux和朋友)。如果你在Windows上,x86_64还有另一个调用约定,其中只有前四个参数被传入寄存器(rcx,rdx,r8,r9)。 – 2016-09-04 14:16:03