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
1条答案
按热度按时间cgfeq70w1#
li
、la
或move
并不总是一条指令,它们是一条或多条机器码MIPS指令的伪指令。(li $v1, 1
通常将汇编成仅一个指令,因为常数很小,但它将是相同的指令作为一个真正的MIPS指令。)因为这一点,我猜他们不来作为一个选项。这里有可以做这样的事情的说明
其他可能的加载包括
lwl
和lwr
未对齐字加载,其中一个将从one: .word 1
加载1
。但是从内存加载需要地址空间的低15位或高15位,这有点不寻常。$31
又名$ra
通常是非零的。$sp
几乎总是非零的,但在不寻常的情况下,可能是以前的一些代码可能已经将其设置为零。或者,如果我们想将$v1 = 1
设置为ROM中的第一条指令,那么它可能在上电后为零。因此,如果我们不计算加载(需要在可到达地址处的额外数据)或非立即
slt[u]
(需要另一个寄存器中的已知非零值),则在经典MIPS I中有六条指令:addi
/addiu
、ori
、xori
、sltiu
和sltiu
。当使用伪指令计数时,
li
和la
也可用。