c - NASM x86 使用 extern printf 打印整数
问题描述
我尝试在 x86 程序集中使用 printf 打印一个整数。对于格式字符串,printf(fmtstring, vals)
我将其存储%d
为 fmtd。然后我将 1 放入 ax,2 放入 bx,添加它们并希望使用调用 printf 打印结果。这是代码。
global _main
extern _printf
section .data
fmtd db "%d"
section .text
_main:
push ebp
mov ebp, esp
_begin:
mov ax, 1
mov bx, 2
add ax, bx
push ax
push fmtd
call _printf
add esp, 8
_end:
mov esp, ebp
pop ebp
ret
但我明白了
-10485757
而不是预期
3
你能帮我看看有什么问题吗?
当我刚写
push 3
push fmtd
call _printf
它像往常一样工作并打印 3。
谢谢
解决方案
您需要使用完整的 32 位寄存器:
你要这个:
mov eax, 1
mov ebx, 2
add eax, ebx
push eax
push fmtd
call _printf
-10485757
你得到的输出解释:
-10485757
十六进制是FF600003
. 来自0003
推push ax
低 16 位的eax
。这FF60
是堆栈上剩余的任何东西。
阅读这篇 SO 文章ax
,详细解释和之间的关系eax
。