MUL 运算符仅采用单操作数形式有什么原因吗?
IMUL 运算符可以采用三种不同的形式(一个、两个或三个操作数),这样更方便。从技术角度来看,我看不出 MUL 运算符不能采用二/三操作数形式的任何原因。
3 回答
并不是 NASM 不支持它——在 CPU 上,指令的签名版本只是支持比未签名版本更多的变体。
它与输出的字节码有关。在 80286 之前的世界中,操作码太多,因此英特尔工程师正在寻找解决问题的方法。一种解决方案是将指定操作(在本例中为乘法)的字节码部分扩展为对第一个操作数进行编码的字节码部分。这显然意味着在执行 MUL 操作码时只能支持一个操作数。因为乘法需要两个操作数,他们通过硬编码到处理器中解决了第一个操作数始终是 eax 寄存器的问题。后来的处理器支持具有多种长度的字节码,这允许它们将更多数据编码到单个命令中。这使他们能够使 IMUL 操作码更加有用。
今天有一个有趣的平行线,IP 地址用完了。
186 指令集引入了三imul
操作数以及带有立即操作数的二操作数形式(这是三操作数形式的别名)。后来,386 增加了带有寄存器和 r/m 操作数的双操作数形式。
所有这些新形式的共同点是,乘法要么用 16 位乘以 16 位(可能来自符号扩展的 8 位立即数)得到 16 位结果,要么用 32 位乘以 32 位得到 32 位结果。在这些情况下,结果的低 16 位或低 32 位与imul
等效的 相同mul
,只有标志(CF 和 OF)可能不同。mul
所以不需要单独的多操作数。据推测,设计者使用了助记符imul
,因为具有 8 位立即数的表单确实对该立即数进行了符号扩展。