分割2个32位有符号整数的最短方法是什么?

时间:2013-09-15 10:01:26

标签: assembly ia-32

我分别在EAXEBX中有两个32位有符号整数。如果我这样做:

xor EDX, EDX
idiv EBX

然后,EAX被视为无符号32位,这是错误的。 MOVSX似乎无法将EAX的点位扩展到EDX:EAX。我还尝试使用CMPSBC,但我无法找到解决方案。

我想知道最短的代码,或者至少是避免跳转的代码。

2 个答案:

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

以下是有关该指示的更多信息:

http://faydoc.tripod.com/cpu/cdq.htm