1

EAX我在和中EBX分别有两个 32 位有符号整数。如果我做:

xor EDX, EDX
idiv EBX

然后,EAX被视为无符号 32 位,这是错误的。MOVSX似乎无法将 sing bit 从 扩展EAXEDX:EAX. 我也尝试使用CMPand SBC,但我无法找到解决方案。

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

4

2 回答 2

5

它不会被转换。idiv是有符号的除法,它将 的 64 位值edx:eax除以 的操作数idiv,余数为edx,商为eax。我想不出比这更快的方法。如果您真的认为它会以某种方式转换,请尝试该CDQ说明。它执行以下操作:

将 EAX 符号扩展为 EDX,形成四字 EDX:EAX。由于 (I)DIV 使用 EDX:EAX 作为其输入,如果在 (I)DIV 之前未手动初始化 EDX(如在 64/32 除法中),则必须在设置 EAX 后调用 CDQ。

于 2013-09-15T10:06:07.890 回答
3

有一个说明:

CDQ

它将存储在 EAX 中的 32 位值符号扩展为 64 位寄存器对 EDX:EAX。这正是 IDIV 指令的参数的寄存器对。

您的代码如下所示:

  CDQ
  IDIV EBX

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

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

于 2013-09-15T10:11:28.180 回答