将负数除以正数

时间:2014-12-09 17:31:31

标签: assembly division

假设以下代码:

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中编码。

2 个答案:

答案 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。