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 № 1x86-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.