问题描述
指令 la $4,-16($9)
可以替换为单个 MIPS 机器指令吗?我一直在寻找,每次都找到lui 和ori 的组合。
解决方法
la
是一条伪指令,并且有一种形式 — la $<target>,label
— 对于 MARS 和 QtSPIM 非常重要,因为这些汇编程序不支持 %hi 和 %lo 函数其他汇编器支持。您通过在线搜索发现这种形式的 la
可以翻译为 lui
和 ori
(或类似的东西)。因为这可能是 la
最常见的用法,也是一种基本形式,这就是我们在在线搜索中找到的内容。
然而,这些汇编器(MARS 和 QtSPIM)在允许各种非实际机器指令的“很好的”形式方面非常有帮助。所以,是的,您显示的表单可以替换为单个“添加”立即注册操作,您可以(并且应该)首先编写它。没有充分的理由使用它来代替更直接的 addiu
。 (但是,并非所有形式的 la
都可以用一条指令代替。)
许多伪指令生成的机器代码指令比您预期的要多。例如,在 MARS 上,la $t1,4($t2)
生成两条机器代码指令,一条将常量 4 加载到 $at
中,另一条则添加 reg,reg,$at
— 由于单个 {{ 1}} 会起到同样的作用。更重要的是,汇编器选择 addiu
而不是 add
,冒着寻址时出现虚假有符号整数溢出陷阱的风险,而应该始终将其视为无符号。
您可以使用 MARS 亲眼看到这一点 — 只需查看反汇编中的伪指令即可。