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

Difference between Pseudo-op and Machine-op?

在学习汇编语言编程时,我遇到了术语 "Pseudo-op" 和 "Machin-op"。我不确定它们的功能是什么,它们之间有何不同?

除了汇编程序指令外,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 个其他寄存器是正常的,这使得它们对于用户 space 代码的使用是不安全的。我猜简化设计 vs. 让硬件在 saving/restoring 中断的架构状态下提供更多帮助,但我没有查看细节。)