假设以下代码:
mov eax, 0
sub eax, 2
xor edx, edx
idiv base
其中base
等于8(定义为const int base = 8
)。
因此,我希望eax
中的0和edx
中的2(或-2)得到0。但是,划分的结果是一个很长的数字。最有可能的是,它是由eax
注册表中的溢出引起的,当我从中减去2时。我认为eax
操作将idiv
解释为unsigned int
。如何正确执行此划分?
我在x64系统上的Visual Studio 2013中编码。
答案 0 :(得分:6)
通常的原因:edx
应该是"上半部分" 64比特的股息。因此,如果你有一个负数,edx
不能为零(至少必须设置符号位,否则它只是不是负数),如果你有一个32位有符号数,你必须将其扩展为edx:eax
。
cdq
指令的作用是什么,所以很简单:
mov eax, -2
cdq
idiv base
答案 1 :(得分:3)
最有可能的问题如下: 在减法之后,EAX中的值将以-2的补码表示为-2:0xFFFF FFFE 如果你想在64位上表示-2,你应该有:0xFFFF FFFF FFFF FFFE 因为您将EDX设置为0,所以您将使用值0x0000 0000 FFFF FFFE = 65534而不是-2
如果是负数,则必须将EDX设置为0xFFFF FFFF,如果是正数,则必须设置为0。