Wpis z mikrobloga

.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.

#programowanie #asembler #assembler #asm #clang
  • 6
  • Odpowiedz
@zwei: wejdz se na jakas grupke na fb np na jak bedzie w maszynie turinga i tam zapytaj, tutaj malo kto chyba umie takie rzeczy xdd
  • Odpowiedz