首页 > 解决方案 > 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。

谢谢

标签: cx86nasm

解决方案


您需要使用完整的 32 位寄存器:

你要这个:

mov eax, 1
mov ebx, 2
add eax, ebx
push eax
push fmtd
call _printf

-10485757你得到的输出解释:

-10485757十六进制是FF600003. 来自0003push ax低 16 位的eax。这FF60是堆栈上剩余的任何东西。

阅读这篇 SO 文章ax,详细解释和之间的关系eax


推荐阅读