在研究它之后,我发现它只是取代获得相同结果的方式。如果我错了,请纠正我。
示例:
move $s0, $t1
可以替换为:
add $s0, $zero, $t1
问题:
如何替换lw
,la
,sw
,bne
?
答案 0 :(得分:3)
是的,move
指令可以用add
指令替换。
伪指令的一些背景:MIPS是RISC(精简指令集计算机)架构,这意味着您可以使用相对较少的指令。这种简单性可以提高性能,但需要权衡的是,更复杂的操作需要多条指令。伪指令是表示一个或多个其他更复杂操作的“假”指令。
在你的问题上:
lw
,sw
和bne
不是伪指令。它们都是由一个MIPS汇编指令执行的。
la
或加载地址是伪指令。 la
可以分解为lui
指令和ori
指令。在32位MIPS架构上,每条指令以及每个寄存器的大小为32位。因此,为了存储32位地址,必须先获取最高有效位(高位)16位,然后再取最低位(低位)16位。
lui
或Load Upper Immediate获取立即字段并将其左移16次并将其存储在临时汇编寄存器中。 ori
指令按位或在临时寄存器上执行立即值,并将完整地址存储在la
指令中指定的初始寄存器中。
编辑:要获取字符串的地址,例如,您可以在函数中使用此代码段:
la $a0, msg # pseudo-instruction to load the address of the label str
您还可以在其他地方定义msg
:
.data
msg: .asciiz "This is a string"
在SPIM中运行此示例后,la
指令将转换为:
lui $1, 4097 [msg]
ori $4, $1, 0 [msg]
$1
是临时汇编寄存器,$4
是寄存器a0
,它是传递给初始la
指令的参数。
参考文献:MIPS Instruction Set并且只是做了很多MIPS。尝试在QTSPIM等模拟器中运行每条指令,看看你得到了什么。
另请参阅:lui 4097和load address