Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 汇编:将x86代码转换为x64的简单示例_Linux_Assembly_64 Bit_X86 64_Nasm - Fatal编程技术网

Linux 汇编:将x86代码转换为x64的简单示例

Linux 汇编:将x86代码转换为x64的简单示例,linux,assembly,64-bit,x86-64,nasm,Linux,Assembly,64 Bit,X86 64,Nasm,在学习x64汇编时,我尝试使用add方法添加两个整数,并使用assembly返回整数。 我有x86的工作代码,我试图转换成x64 我只是简单地将寄存器的名称更改为x64,并且生成的对象文件没有错误,但是当我在C函数中使用它时,我总是得到sum=0 我认为参数位置有问题,并且我没有找到关于此类问题的好文档 section .text global addi addi: push rbp mov rbp, rsp mov rax,[rbp+12]

在学习x64汇编时,我尝试使用add方法添加两个整数,并使用assembly返回整数。 我有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

x64 ABI要求前几个参数在寄存器中传递,而不是在堆栈上传递


请参阅以获得一个很好的解释。

x64 ABI要求前几个参数在寄存器中传递,而不是在堆栈上传递


请参阅以获得详细解释。

x86-64具有amd定义的调用转换,此平台的所有工具链应遵循以下内容:

  • 第一个参数->rdi
  • 第二->rsi
  • 第三->rdx
  • 第四->rcx
  • 第五->rax
所以它应该看起来像:

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

x86-64具有amd定义的调用转换,该平台的所有工具链应遵循以下要求:

  • 第一个参数->rdi
  • 第二->rsi
  • 第三->rdx
  • 第四->rcx
  • 第五->rax
所以它应该看起来像:

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

实际上,这种调用约定一般不适用于x86_64,而是适用于类似SystemV的系统(Linux和friends)。如果您在Windows上,x86_64还有另一种调用约定,其中只有前四个参数在寄存器(rcx、rdx、r8.r9)中传递。实际上,这种调用约定一般不适用于x86_64,而是适用于类似SystemV的系统(Linux和friends)。如果您在Windows上,x86_64还有另一个调用约定,其中只有前四个参数在寄存器(rcx、rdx、r8.r9)中传递。