(x86_64 linux assembly) Por que printf com string de formato float funciona apenas com rsp% 0x10 = 0

Eu tenho um problema com escrever uma chamada de printf no x86_64 linux assembler. Se eu tentar imprimir um valor duplo quandorsp % 0x10 != 0, printf uma queda com segfault.

Olhe para o meu código (sintaxe 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

E seMEM_VAL = 0x10, 0x20, ... , 0x100, ... tudo está bem. Código de trabalho. Mas com outro código de valor é baixo com segfault. Por quê?

Eu compilar e linkar com isso:

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

Aproveitando esta oportunidade, vou perguntar-lhe, onde eu posso ler uma especificação para convenção de chamada em C no x86_64 linux? Eu sei que é uma conversa rápida, mas não consigo entender uma magreza como essa.

questionAnswers(0)

yourAnswerToTheQuestion