假设以下代码:
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中编码.
通常的原因是:edx应该是64比特股息的"上半部分".因此,如果您有一个负数,edx则不能为零(至少必须设置符号位,否则它不是负数),如果您有一个32位有符号数,则必须将其签名扩展为edx:eax.
这是cdq指令的作用,因此很容易:
mov eax, -2
cdq
idiv base
Run Code Online (Sandbox Code Playgroud)