我一直在尝试使用以下代码将数字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链接
答案 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填充,它可能会发生。