Я читаю CS: APP 3-е издание (Ch3. Рис. 3.7 Код сборки GAS)
long exchange(long* xp, long y)
{
long x = *xp;
*xp = y;
return x;
}
exchange:
movq (%rdi), %rax
movq %rsi, (%rdi)
ret
Интересно, почему нижеприведенный код сборки (1. Asm: который преобразуется в nasm) не работает?
я разбирал рабочую функцию c для получения исходного кода сборки nasm с помощью c2nasm.это совершенно отличается от оригинальной сборки.
main.cpp:
int main()
{
long a = 4;
// long b = exchange(&a, 3);
long b = exchange2(&a, 3);
printf("[a: %ld] [b: %ld]\n", a, b);
return 0;
}
1.asm:
BITS 64
; default rel
default abs
global exchange2
section .text
exchange2:
;;; this code does not works
;;; program output -> [a: 4] [b: 0]
mov rax, [rdi]
mov [rdi], rsi
ret
;;; this code works, generated by c2nasm.
;;; program output -> [a: 3] [b: 4]
; push rbp
; mov rbp, rsp
; sub rsp, 16
; mov qword [rbp+10H], rcx
; mov dword [rbp+18H], edx
; mov rax, qword [rbp+10H]
; mov eax, dword [rax]
; mov dword [rbp-4H], eax
; mov rax, qword [rbp+10H]
; mov edx, dword [rbp+18H]
; mov dword [rax], edx
; mov eax, dword [rbp-4H]
; leave
; ret
РЕДАКТИРОВАТЬ: спасибо!
рабочая версия для Windows x64 long long exchange(long long*, long long)
:
BITS 64
default rel
global _exchange2 ; Windows name-mangling prepends _ to C names
section .text
_exchange2:
mov rax, [rcx]
mov [rcx], rdx
ret