имея это:
%macro print 2
push rbp
mov rbp, rsp
mov rdi, %1
mov esi, %2
call printf
leave
ret
%endmacro
section .data
dat db "string %c", 0xa, 0x0
section .text
extern printf
global main
main:
print dat, "n"
mov rax, 60
syscall
Это будет работать нормально.
Но когда я попытался перейти на это (в разделе данных) dat db "string %s", 0xa, 0x0
и (в разделе текста) print dat, "something"
then
p.s:18: warning: dword data exceeds bounds [-w+number-overflow]
p.s:5: ... from macro `print' defined here [-w+number-overflow]
Если строка слишком длинная (5 и более символов), но если она не превышает 4 байта, ошибка «only»: command terminated
. Как видно, printf
принимает только dword
(4 байта) в rsi
(второй [произвольный] аргумент в стиле c), но не в большем типе, но почему? (даже если задана строка из 4 байтов или меньше, все равно command terminated
). Как решить эту проблему?