EAX
我在和中EBX
分别有两个 32 位有符号整数。如果我做:
xor EDX, EDX
idiv EBX
然后,EAX
被视为无符号 32 位,这是错误的。MOVSX
似乎无法将 sing bit 从 扩展EAX
到EDX:EAX
. 我也尝试使用CMP
and SBC
,但我无法找到解决方案。
我想知道最短的代码来做这件事,或者至少是避免跳转的代码。
它不会被转换。idiv
是有符号的除法,它将 的 64 位值edx:eax
除以 的操作数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
以下是有关该指令的更多信息: