Почему nasm printf char, а не string? - PullRequest
0 голосов
/ 13 февраля 2020

имея это:

%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). Как решить эту проблему?

...