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

标签 assembly hardware terminology directive operation

在学习汇编语言编程时,我遇到了“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 个其他寄存器是正常的,这使得用户空间代码使用它们不安全。我想这简化了设计 vs . 让硬件在中断时保存/恢复架构状态方面有更多帮助,但我没有查看细节。)

关于assembly - 伪操作和机器操作的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40778734/

相关文章:

c - 如何通过汇编代码找到固定长度的多维数组?

c - GCC 添加了奇怪的时间变量

assembly - 如何将第9扇区复制到第1扇区?

algorithm - booth 乘法算法是将 2 个正数相乘吗?

python - "Python Implementation"vs. "Python distribution"vs. Python 本身?

c - 简化 assembly 说明

.net - 从 Internet Explorer 访问硬件

c++ - 如何设置IDE ATA Controller 的PIO周期时序?

java - Java 属性、类变量或类字段等中的术语是否正确?非常感谢

android - 在Android中,Task == Application?