Кажется, я не могу правильно вызвать 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.
rdi
, потому что это регистр, сохраняемый вызывающим абонентом. - person Jester   schedule 18.04.2020