如何在NASM中打印64位数字?

时间:2017-07-02 22:08:58

标签: linux assembly nasm x86-64

我正在编写一个子程序,它应该打印在rdi中传递给它的任何内容的十进制值。它适用于每个可以用32位表示的数字。一旦64位值被涉及,事情就会崩溃。

如果我将4294967295或0000000000000000000000000000000011111111111111111111111111111111b作为参数传递,则按预期方式打印。但是如果我做的话

mov rdi, 4294967295
inc rdi
call Print_Unsinged

我得到了错误的结果(确切地说是X96)。

我正在用这种方式检查参数的大小:

mov rbx, rax ; rax has the orginal arg at this point
xor ebx, eax
cmp rbx, 0
jne isQword

mov ebx, eax
xor bx, ax
cmp ebx, 0
jne isDword

cmp ah, 0
jne isWord

jmp isByte

最终发生的事情是,应该具有超出ebx设置的位并且应该跳转到isQword的值跳转到isDword。因此,打印的第一个字符最终是垃圾,而其余数字打印正常。查看第一个代码片段:我希望参数值为000000000000000000000000000000010000000000000000000000000000000000b,然后这将触发跳转到isQword,因为在清除ebx后rbx将设置一个位。但不,这个值一直过滤到isByte并打印“X96”。

我无法理解这一点,任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

这已经解决了,谢谢!

我的代码无法检测64位值的原因(正如有人指出的那样)是对寄存器执行32位操作会清除该寄存器的高32位。

; rax has the orginal rdi argument at this point in the code
mov rbx, rax 
xor ebx, eax ; this clears the upper 32 bits of rbx
cmp rbx, 0 ; these are equal
jne isQword ; so we don't get to isQword when we should