NASM打印整数与Printf

时间:2013-11-28 13:41:42

标签: printf nasm

我一直在尝试使用以下代码将数字0打印到控制台屏幕:

SECTION .data

DAT0:
    db 0
DAT1:
    db "%d"

SECTION .text
global _main
extern _printf

_main:
push DAT0
push DAT1
call _printf
add esp, 8

ret 0

然而,它打印0而不是打印4210688。究竟出了什么问题?

这是组装和&使用NASM和MinGW链接

1 个答案:

答案 0 :(得分:2)

你正在推送地址,而不是数字本身。由于您的数字只有1个字节,因此您需要使用符号扩展名加载它,然后推送该32位整数。

movzx eax, byte [DAT0]
push eax
push DAT1
call _printf
add  esp, 8

或者您可以更改格式字符串以使用"%hhd"来打印8位整数。然后可以在你的号码后加载3个字节的垃圾,因为x86是小端的。

push  dword [DAT0]         ; push a 4-byte memory source operand
push  fmt                  ; push the address of the format string
call  _printf
add   esp,8

...
fmt: db  "%hhd", 0xa, 0   ; print signed char as a number, not a character

请注意,printf需要一个以0结尾的C字符串,因此必须在其末尾有一个,0。如果你运气好,并且你的DAT1之后有0填充,它可能会发生。