我正在写一个子程序,它应该打印在rdi中传递给它的任何东西的十进制值。它适用于每一个可以用32位表示的数字。一旦涉及到64位值,就会出现故障。
如果我传递4294967295或00000000000000000000000000111111111111111111111111111111111 b作为参数,它将按预期打印。但如果我这样做了

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。所以第一个打印出来的字符最后变成了垃圾,而其余的数字打印得很好。看第一个代码片段:我希望参数值为0000000000000000000000000000000000001000000000000000000000000b,然后这将触发到isQword的跳转,因为在清除ebx之后rbx将设置一个位。但不是,这个值一直过滤到isByte并打印“X96”。
我想不通,有人能帮忙吗?

最佳答案

已经解决了,谢谢!
我的代码无法检测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

08-15 22:07
查看更多