.globl _main _main: # pierwsza wersja - wstawiam po prostu wszystko inline lea rdi, [rip + L_.hello] xor rax, rax call _printf # druga wersja - robię calla call _hello xor rax, rax ret _hello: lea rdi, [rip + L_.hello] xor rax, rax call _printf ret L_.hello: .asciz "Hello, world\n" Takie pytanko może mondre może gupie, nwm. Pierwsza wersja rzuca segfaultem, dopiero jak opakuję w push rdi ... pop rdi, to działa. Ale przecież w _hello nie zapisuję stanu rdi, to dlaczego działa? Spojrzałem do System V ABI i rdi jest not callee-saved, więc dlaczego zachowuje się, jakby było saved (a może ja rozumiem callee-saved odwrotnie)? Kompilator to clang 11 na maku.
.globl _main
_main:
# pierwsza wersja - wstawiam po prostu wszystko inline
lea rdi, [rip + L_.hello]
xor rax, rax
call _printf
# druga wersja - robię calla
call _hello
xor rax, rax
ret
_hello:
lea rdi, [rip + L_.hello]
xor rax, rax
call _printf
ret
L_.hello: .asciz "Hello, world\n"
Takie pytanko może mondre może gupie, nwm. Pierwsza wersja rzuca segfaultem, dopiero jak opakuję w
push rdi ... pop rdi
, to działa. Ale przecież w_hello
nie zapisuję stanurdi
, to dlaczego działa? Spojrzałem do System V ABI irdi
jestnot callee-saved
, więc dlaczego zachowuje się, jakby było saved (a może ja rozumiemcallee-saved
odwrotnie)? Kompilator to clang 11 na maku.#programowanie #asembler #assembler #asm #clang
@zwei: ok, to chyba jest mój problem, można się rozejść xD