addi和subi之间的"关系"是什么?

Nik*_*ntz 2 cpu assembly mips nios

我应该回答这个问题.经过一些研究后,它说add和sub具有相同的操作码,仅在功能领域有所不同.这是答案还是其他什么?

更新

它可以在Nios II CPU手册中找到:

subi
subtract immediate
Operation: rB ? rA – ? (IMMED)
Assembler Syntax: subi rB, rA, IMMED
Example: subi r8, r8, 4
Description: Sign-extends the immediate value IMMED to 32 bits, subtracts it from the value of rA and then
            stores the result in rB.
Usage: The maximum allowed value of IMMED is 32768. The minimum allowed value is
–32767.
Pseudo-instruction:
© March 2009
subi is implemented as addi rB, rA, -IMMED
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 6

我不知道MIPS甚至一个正确的subi指令(虽然有些环境可能会为它实现一个宏).

由于您正在减去一个立即值,因此您可以在addi指令中提供它的否定:

addi $r1, $r2, -42     ; equivalent to subi $r1, $r2, 42
Run Code Online (Sandbox Code Playgroud)

立即操作数是一个二进制补码值,这意味着它完全能够成为负数,并且二进制补码的工作方式意味着您可以以无符号方式添加负数,并提供与减去相同的结果(因为您回绕).

例如,-4216位二进制补码是无符号值65494.当您在65536处添加5065494回绕时,您最终得到:

     50
+ 65494 (ie, -42)
  -----
  65544 (overflow, so
- 65536  we wrap at 64K)
  -----
      8 (identical to "50 - 42")
Run Code Online (Sandbox Code Playgroud)