Linux 汇编:将x86代码转换为x64的简单示例
在学习x64汇编时,我尝试使用add方法添加两个整数,并使用assembly返回整数。 我有x86的工作代码,我试图转换成x64 我只是简单地将寄存器的名称更改为x64,并且生成的对象文件没有错误,但是当我在C函数中使用它时,我总是得到sum=0 我认为参数位置有问题,并且我没有找到关于此类问题的好文档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]
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)中传递。