除汇编程序指令外,RISC体系结构通常具有扩展为多个指令的伪操作。
最常见的类型是用于将32位常数(例如地址)放入寄存器所需的指令序列的伪操作。由于固定的32位指令没有空间用于任意32位立即数,因此机器无法在一条指令中执行此操作。然而,通过将这对指令与16位立即分离通常无法获得任何好处,手动执行它会很烦人。 (IIRC,一些超标量有序CPU在背靠背执行时识别这些对,即使它们修改相同的寄存器,仍然并行运行它们。)ARM汇编伪指令 MOV32 和 ADRL 做这个。
MOV32
ADRL
另一个有趣的例子是ARM ldr r0, =0x12345678 。它总是汇编为一条指令,但可以从两种策略中选择:如果常量可以表示为立即( 使用ARM的桶形移位器 ),汇编程序使用MOV。如果没有,它会将常量放入附近的文字池中并使用PC相对负载。所以这个伪操作可以发出指令 和 数据(我认为仍在同一部分)。
ldr r0, =0x12345678
(LDR指令的非伪操作形式是支持ARM各种寻址模式的正常负载寄存器形式,如 ldr r0, [r1, r3, lsl #2] 从中加载 r1 + r3 <<2 )。 的 因此,根据操作数,相同的助记符可以是伪操作或机器指令 强>
ldr r0, [r1, r3, lsl #2]
r1 + r3 <<2
MIPS将伪指令发挥到极致,正常的ABI保留了32个架构寄存器中的至少一个,用作汇编器生成的伪操作的临时值! (我猜MIPS设计人员认为32非常需要,因为在标准ABI中,中断处理程序异常地破坏其他2个寄存器是正常的,这使得用户空间代码使用它们不安全。我想这简化了设计与让硬件更有助于在中断上保存/恢复架构状态,但我没有看过细节。)