我正在写一个子程序,它应该打印在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