伪操作和机器操作之间的区别?

时间:2016-11-24 05:37:28

标签: assembly hardware operation

在研究汇编语言编程时,我遇到了“伪操作”和“机器操作”这两个术语。我不确定它们的功能是什么以及它们之间的区别如何?

1 个答案:

答案 0 :(得分:2)

除了汇编程序指令之外,RISC体系结构通常具有扩展为多个指令的伪操作。

最常见的类型是伪操作,用于将32位常数(例如地址)放入寄存器所需的指令序列。由于固定的32位指令没有空间容纳任意32位立即数,因此机器无法在一条指令中执行此操作。然而,通过将这对指令与16位立即分离通常无法获得,手动执行它会很烦人。 (IIRC,一些超标量有序CPU在背靠背执行时识别这些对,即使它们修改相同的寄存器,它们仍然并行运行它们。)ARM汇编程序伪指令MOV32ADRL这样做。

另一个有趣的例子是ARM的ldr r0, =0x12345678。它总是汇编为一条指令,但可以从两种策略中选择:如果常量可以表示为立即数(using ARM's barrel shifter),则汇编程序使用MOV。如果没有,它会将常量放入附近的文字池中并使用PC相对负载。所以这个伪操作可以发出指令数据(我认为仍然在同一部分)。

(LDR指令的非伪操作形式是支持ARM的各种寻址模式的正常负载寄存器形式,例如从ldr r0, [r1, r3, lsl #2]加载r1 + r3 <<2因此,相同的助记符可以是伪操作或机器指令,具体取决于操作数

MIPS将伪指令发挥到极致,正常的ABI保留32个架构寄存器中的至少一个,用作汇编器生成的伪操作的临时指令! (我猜MIPS设计人员认为32非常需要,因为在标准ABI中,中断处理程序异常地破坏其他2个寄存器是正常的,这使得用户空间代码使用它们不安全。我猜简化设计与使硬件更有助于在中断上保存/恢复架构状态,但我还没有看到细节。)