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

标签 assembly mips

这是一个在过去的几篇论文中出现过的问题,但我在互联网上找不到任何相关内容。

哪六个单指令 MIPS 可以设置 $v1 来保存十进制值 1?

最佳答案

与常见的误解相反,lilamove 并不总是只是一条指令。它们是汇编为一个或多个机器代码 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

其他可能的加载包括 lwllwr 未对齐单词加载,其中之一将从 one: 加载 1 。单词 1。但是从内存加载需要地址空间的低 15 位或高 15 位中的地址,这有点不寻常。

$31 又名 $ra 通常不为零。 $sp 几乎总是非零,但在异常情况下,某些先前的代码可能已将其设置为零。或者,如果我们想将 $v1 = 1 设置为 ROM 中的第一条指令,那么上电后它可能为零。

因此,如果我们不计算负载(需要在可访问地址处提供额外数据)或非立即 slt[u](需要另一个寄存器中已知的非零值),我们有 6 个经典 MIPS I 中的指令:addi/addiuorixorisltiusltiu

当使用伪指令计数时,lila 也可用。

关于assembly - 将寄存器设置为 1 的 MIPS 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30650451/

相关文章:

assembly - 为什么获取语义仅适用于读取,而不适用于写入? LL/SC 如何获取 CAS 锁定而不用临界区进行存储重新排序?

assembly - MARS(MIPS 汇编)上的中断指令是什么类型

stack - 如何从 MIPS 程序集中的堆栈中弹出?

arrays - 访问 emu8086 中的数组

assembly - 在 "real world"情况下编码的良好做法是什么?

c - ra ($31) 寄存器包含未对齐的返回地址 (MIPS)

assembly - MIPS 中括号的作用是什么?

c - C 和汇编中奇怪的变量问题

assembly - 我将如何实现 Int 16h 以使用键盘在我的程序中导航?