我搜索了一下,没有找到任何可以正确解释这一点的东西。
在 MIPS 中,您可以使用
add
和 addu
进行加法运算。主要区别在于addu
不会产生溢出异常。
假设我们有这个二进制文件(我使用了四位,尽管为了简化 MIPS 是 32):
0111
如果我们添加
1
它变成1000
.
对于
add
指令,存在溢出且无进位,因为正 7 变为负 1(假设 MIPS 中的二进制补码)。这也会产生溢出异常。
对于
addu
,没有溢出也没有进位,因为一切都按预期进行。
现在假设你有这个二进制文件:
1111
如果我们添加
1
它变成0000
.
使用
add
指令应该不会溢出,因为负 1 变为 0。进位标志怎么样,它会变为 1 吗?
addu
指令会发生什么?是否认为溢出,因为 15 变成了 0?我知道没有溢出异常,但是溢出标志怎么办?它是否设置为 1?进位标志呢?
MIPS 架构中没有进位标志。
当结果的符号与可能发生的预期符号不同时,在加法的情况下会发生溢出异常:
所以是的,在你假设的 4 位 MIPS 0111+1 中导致溢出,相应的标志被激活。
我用谷歌搜索了一下,发现这很有用。
(我认为)这解释了为什么 MIPS 中没有进位。
https://yarchive.net/comp/carry_bit.html
快速总结:MIPS 的目标是简化实现,而进位位会使事情变得更加复杂,尤其是在更具侵略性(流水线/超标量/推测和乱序)的设计中。
在简单的流水线设计中,每个结果都写回其目标寄存器,并且结果通常通过旁路网络提供,以防下一条指令立即需要它。
如果你采用典型的当前 RISC 并包括“add-with-carry”,例如(这当然是可行的),不规则性肯定会增加复杂性,并且进位位可能成为更积极的实现中的瓶颈,因为操作要么设置它要么测试它在它上面序列化,并且还需要在一个尴尬的地方使用额外的硬件(比较器和多路复用器)。 (参见 H&P:在索引中查找绕过和条件代码)。
随着 CPU 变得超标量化,用于检查依赖性的额外逻辑变得更糟:实现者尤其讨厌不规则性。
随着它变得推测性和乱序,典型的设计不仅需要寄存器重命名单元,还需要“进位重命名单元”,因为没有“进位位”这样的东西,但是而是一组独立的进位位,具有适当的重命名逻辑,以选择由逻辑上最近设置该位的指令设置的正确进位位。
• 如何在以下数组中找到并保存元素 80 的 x 和 y 坐标,以便我可以在 mips 中更改元素的位置
• 如何修改以下 mips 代码,使元素 82 包含在数组中
• 每当以 mips 按下 w 时,我如何将元素 80 在数组中向上移动
• 我有一个斐波那契函数的 MIPS 代码。如何扩展在终端中打印给定位置的代码?
• 如何在 MIPS 汇编语言中偏移字符串以便只打印子字符串?
• 如何在 C 中减去两个带符号的 32 位数字时检测溢出?
• Fluent-bit:从单个日志文件中提取两行类别到两个输出