(сборка Linux x86_64) Почему printf со строкой формата float работает только с rsp% 0x10 = 0

У меня проблема с записью вызова printf на ассемблере Linux x86_64. Если я попробую вывести двойное значение, когдаrsp % 0x10 != 0Распечатайте падение с segfault.

Посмотрите на мой код (синтаксис 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

ЕслиMEM_VAL = 0x10, 0x20, ... , 0x100, ... все хорошо. Кодекс работы. Но с другим значением код не работает с segfault. Зачем?

Я собираю и связываю с этим:

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

Пользуясь случаем, я спрошу вас, где я могу прочитать спецификацию соглашения о вызовах C в Linux x86_64? Я знаю, что это быстрый звонок, но я могуЯ не понимаю такой толщины.

Ответы на вопрос(0)

Ваш ответ на вопрос