将负数除以正数

Iva*_*lov 1 assembly division

假设以下代码:

mov eax, 0
sub eax, 2

xor edx, edx
idiv base
Run Code Online (Sandbox Code Playgroud)

其中base等于8(定义为const int base = 8).

结果,我希望得到0 eax和2(或-2)edx.但是,划分的结果是一个很长的数字.最有可能的是eax,当我从中减去2时,它是由注册表中的溢出引起的.我认为eax通过idiv操作解释为unsigned int.如何正确执行此划分?

我在x64系统上的Visual Studio 2013中编码.

har*_*old 6

通常的原因是:edx应该是64比特股息的"上半部分".因此,如果您有一个负数,edx则不能为零(至少必须设置符号位,否则它不是负数),如果您有一个32位有符号数,则必须将其签名扩展为edx:eax.

这是cdq指令的作用,因此很容易:

mov eax, -2

cdq
idiv base
Run Code Online (Sandbox Code Playgroud)