这是一个在过去的几篇论文中出现过的问题,但我在互联网上找不到任何相关内容。
哪六个单指令 MIPS 可以设置 $v1 来保存十进制值 1?
最佳答案
与常见的误解相反,li
、la
或 move
并不总是只是一条指令。它们是汇编为一个或多个机器代码 MIPS 指令的伪指令。 (li $v1, 1
通常只会汇编为一条指令,因为常量很小,但它将与真正的 MIPS 指令之一是相同的指令。)因此,我猜他们不这样做t 作为一个选项。
这里是可以执行此操作的说明
addi $v1, $zero, 1
addiu $v1, $zero, 1
ori $v1, $zero, 1
xori $v1, $zero, 1
# these use comparison
slt $v1, $zero, $31 # the last one can be any non-zero register. $31 is $ra
slti $v1, $zero, 1
sltu $v1, $zero, $31 # the last one can be any non-zero register
sltiu $v1, $zero, 1
# these use memory
lb $v1, one($zero)
lbu $v1, one($zero)
lh $v1, one($zero)
lhu $v1, one($zero)
lw $v1, one($zero)
one: .word 1 # assuming little-endian MIPS where the lowest-address byte is 1
其他可能的加载包括 lwl
和 lwr
未对齐单词加载,其中之一将从 one: 加载
。但是从内存加载需要地址空间的低 15 位或高 15 位中的地址,这有点不寻常。1
。单词 1
$31
又名 $ra
通常不为零。 $sp
几乎总是非零,但在异常情况下,某些先前的代码可能已将其设置为零。或者,如果我们想将 $v1 = 1
设置为 ROM 中的第一条指令,那么上电后它可能为零。
因此,如果我们不计算负载(需要在可访问地址处提供额外数据)或非立即 slt[u]
(需要另一个寄存器中已知的非零值),我们有 6 个经典 MIPS I 中的指令:addi
/addiu
、ori
、xori
、sltiu
和sltiu
。
当使用伪指令计数时,li
和 la
也可用。
关于assembly - 将寄存器设置为 1 的 MIPS 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30650451/