Изглежда, че не мога да извикам 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