assembly 将寄存器设置为1的MIPS指令

jobtbby3  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(147)

这是一个在过去的几篇论文中出现的问题,但我在互联网上找不到任何关于它的信息。
哪六条单指令MIPS可以设置$v1以保存十进制值1?

cgfeq70w

cgfeq70w1#

lilamove并不总是一条指令,它们是一条或多条机器码MIPS指令的伪指令。(li $v1, 1通常将汇编成仅一个指令,因为常数很小,但它将是相同的指令作为一个真正的MIPS指令。)因为这一点,我猜他们不来作为一个选项。
这里有可以做这样的事情的说明

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

其他可能的加载包括lwllwr未对齐字加载,其中一个将从one: .word 1加载1。但是从内存加载需要地址空间的低15位或高15位,这有点不寻常。
$31又名$ra通常是非零的。$sp几乎总是非零的,但在不寻常的情况下,可能是以前的一些代码可能已经将其设置为零。或者,如果我们想将$v1 = 1设置为ROM中的第一条指令,那么它可能在上电后为零。
因此,如果我们不计算加载(需要在可到达地址处的额外数据)或非立即slt[u](需要另一个寄存器中的已知非零值),则在经典MIPS I中有六条指令:addi / addiuorixorisltiusltiu
当使用伪指令计数时,lila也可用。

相关问题