Assembly 为什么不能在mul指令中使用立即数?

Assembly 为什么不能在mul指令中使用立即数?,assembly,arm,armv7,instruction-set,Assembly,Arm,Armv7,Instruction Set,我正在为ARMv7处理器编写指令。我想知道为什么在MUL指令本身中不允许有一个常量值?您可以使用ADD和SUB指令,那么为什么不使用MUL呢 干杯这就是处理器架构的工作原理。不同的体系结构有不同的需求 通常,这样的选择是一个折衷的决定,以优化其他操作/内存访问/缓存利用率。这种折衷通常比在硅上包含该指令更为有利。如果您查看一下,您会发现只有数据处理指令支持立即操作数();它们是唯一具有12位操作数2的指令,其他所有指令最多具有用于Rs和Rm的4位字段(中间剩余的空间用于消除与其他指令类别之间的歧

我正在为ARMv7处理器编写指令。我想知道为什么在MUL指令本身中不允许有一个常量值?您可以使用ADD和SUB指令,那么为什么不使用MUL呢


干杯

这就是处理器架构的工作原理。不同的体系结构有不同的需求

通常,这样的选择是一个折衷的决定,以优化其他操作/内存访问/缓存利用率。这种折衷通常比在硅上包含该指令更为有利。

如果您查看一下,您会发现只有数据处理指令支持立即操作数();它们是唯一具有12位操作数2的指令,其他所有指令最多具有用于Rs和Rm的4位字段(中间剩余的空间用于消除与其他指令类别之间的歧义)


这个决定可能是因为在乘法指令中嵌入直接数并不是特别有趣;如果乘法器是已知的,
mul
通常是一个错误的选择,因为通常存在更快的加法/移位/减法序列。此外,乘法指令的成本可能是,通过在指令中使用直接序列获得的延迟增益不能证明“窃取”是正当的用于数据处理指令编码的16位中的一个槽。

由于arm使用的是某种固定的指令长度,所以没有多少位剩余,有一个桶形移位器。尽管考虑科学记数法,您可以移位一组位,但不能分散(除了围绕顶部移位),所以0x00000099,0x00099000、0x09900000通常是正常的,这取决于指令/集合,但0x00900090可能不是,当然不是0x12345678,这没有意义。RISC而非CISC并不意味着每一条指令都能做任何事情,要比CISC更考虑负载存储体系结构…

“因为ISA这么说,“通常常数乘法器是2的幂,可以通过移位来完成。ARM确实支持这一点(非常好),因此它涵盖了大部分的基址。现代x86通常具有非常强大的整数乘法功能(例如,对于任何高达64位的操作数,都有3个周期的延迟)。我想ARM不会花那么多晶体管,但现在它的速度有多慢?当ARM ISA被设计时,乘法器可能比现在慢。我想使用ARM内置的桶形移位器,用几个设定位移位、添加或细分乘法器是非常有效的,但是在典型的ARM CPU上,收支平衡是什么呢?在x86上,如果吞吐量比延迟更重要,那么使用2 LEA指令而不是
imul r32、r/m32、imm8
是值得的,但3 LEA并不值得。从处理器诞生到今天,mul的速度取决于您想要消耗多少芯片空间、一个时钟、2、4、32等。架构(/age)与此无关,乘法运算的时间比电要长得多,数字处理器就更少了。如果您查看ARM TRM,您会发现其中一些在编译时具有一个或多个时钟的选项,因此作为芯片设计师,您可以自己选择使用。有了x86,你就能得到你想要的,英特尔选择。