Вызов sprintf в сборке x64

Кажется, я не могу правильно вызвать sprintf() в ассемблере.

Когда я пытаюсь dprintf() отформатировать свой буфер, все, что я получаю, это:

(null)

и ошибка сегментации. При запуске lldb с моей программой причиной сбоя является strlen(), так как он не может найти \0 в моем буфере.

Вот мой код:

mov     rdi, buff
mov     rsi, 0
mov     rdx, 17
call    memset
lea     rsi, [rel n_head]
mov     rdx, rax
call    sprintf
mov     rdx, rdi
lea     rsi, [rel fmt]
mov     rdi, 1
call    dprintf

...

section .data
    n_head: db "Low battery: %d%%", 0
    fmt:    db "%s", 10, 0

section .bss
    buff:   resb 17

Что я сделал не так?

Собираю с nasm -f elf64 и clang с nasm 2.14.02 и llvm 10.0.0 на FreeBSD 12.1-RELEASE amd64.


person JozanLeClerc    schedule 18.04.2020    source источник
comment
Проверьте свои соглашения о вызовах   -  person Michael Chourdakis    schedule 18.04.2020
comment
Вам нужно перезагрузить rdi, потому что это регистр, сохраняемый вызывающим абонентом.   -  person Jester    schedule 18.04.2020