Assembly 2个32位有符号整数的最短除法是什么?

Assembly 2个32位有符号整数的最短除法是什么?,assembly,x86,Assembly,X86,我在EAX和EBX中分别有两个32位有符号整数。如果我这样做: xor EDX, EDX idiv EBX 然后,EAX被视为无符号32位,这是错误的MOVSX似乎无法将sing位从EAX扩展到EDX:EAX。我还试着玩CMP和SBC,但我找不到解决方案 我想知道最短的代码,或者至少是避免跳转的代码。它不会被转换idiv是有符号除法,它将edx:eax的64位值除以idiv的操作数,将余数除以edx,将商除以eax。我想不出比这更快的办法了。如果您真的认为它以某种方式被转换,请尝试CDQ指令。

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

xor EDX, EDX
idiv EBX
然后,
EAX
被视为无符号32位,这是错误的
MOVSX
似乎无法将sing位从
EAX
扩展到
EDX:EAX
。我还试着玩
CMP
SBC
,但我找不到解决方案


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

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

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


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

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


这里有一个说明:

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

您的代码如下所示:

  CDQ
  IDIV EBX
以下是有关该说明的更多信息:


有一个说明:

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

您的代码如下所示:

  CDQ
  IDIV EBX
以下是有关该说明的更多信息: