Извикване на 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