【发布时间】:2013-07-10 10:20:45
【问题描述】:
在研究它是什么之后,我发现它只是替换获得相同结果的方式。如果我错了,请纠正我。
示例:
move $s0, $t1
可以替换为:
add $s0, $zero, $t1
问题:
lw、la、sw、bne如何替换?
【问题讨论】:
标签: mips pseudocode
在研究它是什么之后,我发现它只是替换获得相同结果的方式。如果我错了,请纠正我。
示例:
move $s0, $t1
可以替换为:
add $s0, $zero, $t1
问题:
lw、la、sw、bne如何替换?
【问题讨论】:
标签: mips pseudocode
是的,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
【讨论】:
la替换的实际例子吗? mgs: .word 1 lui $t1, mgs ori $t1, $t1, mgs am i right?
lui 指令没有被翻译成lui $1, 4097 [msg]。它被转换为lui $1,xxx,其中xxx 是消息地址的高16 位的值,在链接时确定。您似乎误解了您在评论中提到的答案之一。另外 4097 not 等于 16 位移位,乘以 64k 将等效于 16 位移位。
lui $1, 4097[msg],但这就是我在 SPIM 中运行示例时得到的。我编辑了我的帖子以澄清这一点。