程序集printf调用打印错误的值

时间:2015-05-12 03:39:42

标签: assembly format printf

此时在我的代码中我知道eax包含12345678(在我的调试器中说的是这样)

    push    eax
    push    print_r
    call    printf
    add     esp, 8

我的格式字符串是

print_r:    db 0Ah, "number: %hd", 10, 0

而不是打印12345678,它打印24910

当eax包含1234时,它会正确打印1234

我有一种感觉它与字符串格式化%hd有关,但我不知道如何做到这一点,所以它可以打印无论数字的大小/符号是什么。

1 个答案:

答案 0 :(得分:0)

这是因为您使用%hd进行打印。 %hd取16b值并打印出来,但是你提供了32b的值。

发生了什么:您的值是12345678,这意味着0xBC614E。现在因为你使用%hdprintf只考虑16b这个数字(数字将被截断为16b),打印的值将是0x614e,这正是你的打印值:24910。

2可能已修复:

  • 将“%d”替换为printf格式“%hd”
  • 用于在16b(介于-32769和32768之间)打印数字。