/ / Assembly: Convertendo o código x86 em x64 para um exemplo simples - linux, assembly, 64bit, x86-64, nasm

Assembly: Convertendo o código x86 para x64 para um exemplo simples - linux, assembly, 64bit, x86-64, nasm

Enquanto estou aprendendo montagem x64, estou tentando criar um método para adicionar dois números inteiros e retornar números inteiros usando assembly. Eu tinha o código de trabalho com x86 e tentei converter para x64

simplesmente alterei os nomes dos registradores "para o de x64 e o arquivo de objeto gerado sem erros, mas quando o uso dentro da minha função C, sempre obtenho soma = 0.

Acho que há um problema com a localização dos argumentos e não encontrei uma boa documentação para esses problemas.

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

Respostas:

3 para resposta № 1

x86-64 possui uma conversão de chamada definida por amd, todas as ferramentas para esta plataforma devem seguir o seguinte:

  • 1º argumento -> rdi
  • 2º -> rsi
  • 3º -> rdx
  • 4º -> rcx
  • 5º -> rax

então deve parecer com:

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

2 para resposta № 2

A ABI x64 exige que os primeiros argumentos sejam passados ​​nos registradores, não na pilha.

Vejo Layout de quadro de pilha no x86-64 para uma boa explicação.