(conjunto de linux x86_64) ¿Por qué printf con cadena de formato flotante funciona solo con rsp% 0x10 = 0

Tengo un problema con escribir una llamada de printf en el ensamblador de linux x86_64. Si intento imprimir un valor doble cuandorsp % 0x10 != 0, printf una caída hacia abajo con segfault.

Mira mi código (sintaxis 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

SiMEM_VAL = 0x10, 0x20, ... , 0x100, ... todo es bueno. Código de trabajo. Pero con otro código de valor está abajo con segfault. ¿Por qué?

Compilo y vinculo con esto:

nasm -f elf64 ex.asm
ld -lc -lm -m elf_x86_64 -I/lib/ld-linux-x86-64.so.2 ex.o -o ex

Aprovechando esta oportunidad, le preguntaré, ¿dónde puedo leer una especificación para la convención de llamadas C en x86_64 linux? Sé que es una llamada rápida, pero no puedo entender una delgadez como esta.

Respuestas a la pregunta(0)

Su respuesta a la pregunta