这部分MIPS代码中使用ori有什么用?

ath*_*ena 4 assembly mips

有人可以在这里解释“ori”的用法吗?我知道它是按位或,但我不知道它是如何工作的,也不知道为什么这里需要它。

 #objective of the program is to add 5 and 7
.data #variable declaration follow this line
.text #instructions follow this line
main:
ori $s0, $zero, 0x5
ori $s1, $zero, 0x7
add $t0, $s0, $s1
li $v0,10 # required for only QtSPIM
syscall # required for only QtSPIM
#end of program
Run Code Online (Sandbox Code Playgroud)

Nil*_*nck 7

  ori $s0, $zero, 0x5
  ori $s1, $zero, 0x7
Run Code Online (Sandbox Code Playgroud)

这两条指令将常量 0x05 加载到寄存器 $s0 中,将 0x07 加载到寄存器 $s1 中。

MIPS 没有直接将常量加载到寄存器中的指令。因此,操作数为零且立即数的逻辑 OR 用作替换。它具有与移动相同的效果。将这两行转换为 c 样式代码是:

  $s0 = 0 | 0x05;
  $s1 = 0 | 0x07;
Run Code Online (Sandbox Code Playgroud)

您还可以使用:

  addi $s0, $zero, 0x5
  addi $s1, $zero, 0x7
Run Code Online (Sandbox Code Playgroud)

这做同样的事情,但使用添加而不是逻辑或。翻译成代码就是这样。

  $s0 = 0 + 0x05;
  $s1 = 0 + 0x07;
Run Code Online (Sandbox Code Playgroud)

  • 然而,`LI` 仍然可用,因为汇编器足够聪明,可以在不需要时省略`LUI`。另请注意,`LI` 可能会被翻译为`ORI` 以外的其他内容,例如`ADDIU`。 (3认同)
  • 为什么我们不能使用 li $s0, 5 来代替? (2认同)
  • LI 是一条伪指令,它被转换为 LUI 和 ORI 指令对。如果您想加载 32 位常量,它是合适的。对于适合 16 位的常量,ORI 方式可以保存指令,因为在这种情况下不需要 LUI。这就是为什么您在这里看到 ORI 而不是 LI。 (2认同)