这是我的一些代码:
la $t2, $LC1
la $t9,($t2)
addiu $t3,$t2,%lo($LC1)
lw $t8,4($t3)
addiu $t3,$t2,%lo($LC1)
lw $t7,8($t3)
addiu $t3,$t2,%lo($LC1)
lw $t6,12($t3)
addiu $t3,$t2,%lo($LC1)
lw $t5,16($t3)
addiu $t3,$t2,%lo($LC1)
lw $t4,20($t3)
addiu $t3,$t2,%lo($LC1)
以下是错误:
Error in /Applications/mips7.asm line 101 column 9: "addiu": Too many or incorrectly formatted operands. Expected: addiu $t1,$t2,-100
Error in /Applications/mips7.asm line 103 column 9: "addiu": Too many or incorrectly formatted operands. Expected: addiu $t1,$t2,-100
Error in /Applications/mips7.asm line 105 column 9: "addiu": Too many or incorrectly formatted operands. Expected: addiu $t1,$t2,-100
Error in /Applications/mips7.asm line 107 column 9: "addiu": Too many or incorrectly formatted operands. Expected: addiu $t1,$t2,-100
Error in /Applications/mips7.asm line 109 column 9: "addiu": Too many or incorrectly formatted operands. Expected: addiu $t1,$t2,-100
MIPS编译器,汇编器和链接器使用多个指令和%hi
与lui
和%lo
与addiu
。
MARS不支持%hi
或%lo
地址操作功能,而是提供了一个伪指令la
,将标签的整个32位地址加载到寄存器中。 (此指令扩展为两个涉及lui
的机器代码指令和另一个类似的ori
。
因此,使用%hi
和%lo
将两条指令折叠成一个 MARSla
,然后使用该地址实现预期效果:加载地址,或者加载或存储到全局数据标签。
如果预期效果是从全局/静态数据标签加载或存储,则 MARS 还支持lw $t0, label
和伪指令形式sw $t0, label
。
一般来说,MARS 伪指令隐藏了底层机器代码细节,包括在lui
指令之一可能被消除或共享时隐藏手动优化的机会。 例如,如果我们这样做global_var++
,那应该只需要一个lui
,一个lw
和一个sw
但在MARS中,lw $, label
后跟sw $, label
将涉及两个lui
指令。
以下内容对 MARS 没有意义:
la $t2, $LC1
addiu $t3,$t2,%lo($LC1)
因为la
已经为$LC1
生成了完整的32位地址,所以没有必要向该指针添加偏移%lo($LC1)
。