我应该回答这个问题。 经过一番研究,它说,添加和子具有相同的操作码,只在场上司职不同。 这就是答案或别的东西吗?
更新
它的问世在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
我不知道MIPS甚至有一个适当的subi
指令(尽管有些环境可以实现宏的话)。
既然你减去立即值,你可以提供它的否定addi
指令:
addi $r1, $r2, -42 ; equivalent to subi $r1, $r2, 42
该立即数是2个的补码值,这意味着它完全能够成为负数和补工作方式意味着你可以在一个无符号的方式添加一个负数,并且给出了相同的结果减去(因为你环绕)。
例如, -42
的16位二进制补码是无符号值65494
。 当您添加50
和65494
,在65536缠绕,你结束了:
50
+ 65494 (ie, -42)
-----
65544 (overflow, so
- 65536 we wrap at 64K)
-----
8 (identical to "50 - 42")
在ISA设计的硬件/机器代码级别,MIPS没有subi
/ subiu
指令。 这是有道理的,因为MIPS没有一个标志位寄存器。
有没有将记录加入负或减去一个积极的区别,好像有很多其他的架构(X86,ARM等诸多少RISCy架构)进位标志。 因此花费额外的操作码(并对其进行解码晶体管)是没有意义的。
添加否定眼前不会改变的签署 -overflow检测addi
/ subi
。 当你的同号两个数字相加,结果的符号相反你得到签署溢出。 或减少时, z = x - y
,如果X和Y具有相反的符号,并z
和x
具有相反的信号,这就是减法溢出(您想subi
,捕获) y
是即时的,所以其实现为z = x + y_negated
使得addi
的溢出检测工作。
当然,通常你(或C编译器)将只使用addiu
/ subiu
因为你不想陷阱,宁愿环绕的签署,溢出的行为,除非你编译-fsanitize=undefined-behavior
或一些东西。
在ASM源代码级别,它可以被实现为方便伪指令时,你的报价从NIOS II手册所示。 (甚至作为一个宏,在不支持的伪指令汇编。)
当硬件的唯一时间subi
/ subiu
将节省的指令是,当你想增加32768
/减-32678
。 (注意NIOS II手册指出subi
支持的立即在-32767 .. 32768
的范围,相反从正常符号的16位2的补码-32768 .. 32767
)
2的补最负号是一个异常,它的负面需要一个额外的位正确表示。 即-(0x8000)
溢出到0x8000
的16位立即。 实现任何像样的汇编subi
作为伪指令应该警告这个,或警告使用立即签名的16位范围之外addi
/ addiu
。
addiu
登录延伸其立即到32位,同为addi
。 “无符号”是用词不当。 为什么我们要使用addiu而不是阿迪? 。 符号和无符号除了是2的补机相同的二进制操作。 命名样的签署溢出是未定义的行为匹配C,但请注意,undefined 不需要断层。 想想addi
溢流核对签字此外,只有使用它,当你特别想要的。
有趣的事实: ori
和其他布尔做零扩展他们的直接,所以li $t0, val
可以扩展到只针对一个指令val = -32768 .. 65535
,即使用addiu $t0, $zero, signed_int16
或ori $t0, $zero, uint16
。
以上同意。 阐述了一些环境。 提出的有点道理我已经看到了这个问题。 开发自己的(阴谋)的理论。
关键字是在倒数第二行(第3,包括版权)那里 - 它是一个伪指令。 这始终是一个通用类的问题,所以它的价值,清楚。 有些仿真器(看着你火星),把它作为一个真正的指令,而其他(qtspim - 耻辱)甚至不会刻意去编译它。
虽然我从来没有找到一个很好的例子,据说它,它太简单转换一个到另一个,所以它是多余的。 他们试图遵循“简单的设计原则”。 对我来说,这打破了一点,因为有大量的伪指令已经代表其他命令的简单reworkings的。 分支虚拟指令分解成2级的命令,而这将需要2个或甚至3命令。 所以,这一次也不例外。 什么之类的东西“礼”。 我是说,拜托,那只是addiu。 没有其他的。 如果他们补充说,有严重的借口。 老实说,我觉得这是比较容易添加它的简单性和对称性的缘故。 但随后,会发生什么样大家的喜爱MIPS考试的问题吗?
这就是真正的原因没有SUBI。 对于平庸的老程序员ASM与本科生螺丝。