(x86_64 linux assembly) Dlaczego printf z ciągiem znaków typu float działa tylko z rsp% 0x10 = 0
Mam problem z napisaniem wywołania printf na asemblerze x86_64. Jeśli spróbuję wydrukować podwójną wartość, gdyrsp % 0x10 != 0
, printf upadek z segfault.
Spójrz na mój kod (składnia nasm):
[bits 64]
global _start
extern printf
extern pow
section .data
printf_format db '%lf', 10, 0
section .text
_start:
mov rbp, rsp
sub rsp, MEM_VAL
mov rax, 0x4000000000000000
mov qword [rsp], rax
movsd xmm0, qword [rsp]
mov rdi, printf_format
mov rax, 1
call printf
mov rax, 60
mov rdi, 0
syscall
JeśliMEM_VAL = 0x10, 0x20, ... , 0x100, ...
wszystko jest dobrze. Praca z kodem. Ale z innym kodem wartości nie działa segfault. Czemu?
Kompiluję i łączę z tym:
nasm -f elf64 ex.asm
ld -lc -lm -m elf_x86_64 -I/lib/ld-linux-x86-64.so.2 ex.o -o ex
Korzystając z okazji, zapytam Cię, gdzie mogę odczytać konwencję wywołania C w linuxie x86_64? Wiem, że to szybkie połączenie, ale nie rozumiem takiej chudości.