我分别在EAX
和EBX
中有两个32位有符号整数。如果我这样做:
xor EDX, EDX
idiv EBX
然后,EAX
被视为无符号32位,这是错误的。 MOVSX
似乎无法将EAX
的点位扩展到EDX:EAX
。我还尝试使用CMP
和SBC
,但我无法找到解决方案。
我想知道最短的代码,或者至少是避免跳转的代码。
答案 0 :(得分:5)
它没有被转换。 idiv
是已签名的divison,它将edx:eax
的64位值除以idiv
的操作数,余数为edx
,商为eax
。我想不出比这更快的方法。如果你真的认为它以某种方式转换,请尝试CDQ
指令。它执行以下操作:
将EAX签名扩展到EDX,形成四字EDX:EAX。由于(I)DIV使用EDX:EAX作为输入,如果在(I)DIV之前未手动初始化EDX(如在64/32分区中),则必须在设置EAX后调用CDQ。
答案 1 :(得分:3)
有一条指示:
CDQ
它将存储在EAX中的32位值符号扩展为64位寄存器对EDX:EAX。这正是寄存器对,它是IDIV指令的参数。
您的代码如下所示:
CDQ
IDIV EBX
以下是有关该指示的更多信息: