在研究它是什么之后,我发现它只是替换获得相同结果的方式。如果我错了,请纠正我。
例子:
move $s0, $t1
可以替换为:
add $s0, $zero, $t1
问题:
lw
, la
, sw
,怎么换bne
?
在研究它是什么之后,我发现它只是替换获得相同结果的方式。如果我错了,请纠正我。
例子:
move $s0, $t1
可以替换为:
add $s0, $zero, $t1
问题:
lw
, la
, sw
,怎么换bne
?
是的,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 指令集和从仅仅做了很多 MIPS。尝试在像QTSPIM这样的模拟器中运行每条指令,看看你会得到什么。