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
以下是有关该说明的更多信息: