2017-01-25 13 views
2

我知道SUB期间的进位标志被设置,只要被减数小于减数并且需要借位,但一直未能找到任何更详细的解释。减数更大时如何设置进位标记?

由于减法实际上只是加上二进制补码,CPU如何知道减数较大并且发生了借位?

我唯一能想到的是,可能在SUB期间自动设置进位标志,每当将减数转换为2的补码时。然后,除非另一次进位发生(因为在添加期间,每当被加分的次数大于减数),将其切换回去,它将保持打开状态。

还是我的方式?

+3

您是过于复杂了。处理器不知道2的补码。 ALU减去操作数,结果进入该“C”标志。它还会将“O”标志从执行结果设置为m.s.位。和“S”的标志来镜像m.s.位。如果结果为“0”,则返回“Z”标志。其他标志也取决于处理器。 *如何完成?这不是一个“语言”问题。 –

+1

从转换的进位丢弃,输出进位是从加进位进位。一些架构实际上并没有否定它,所以当没有借用发生时,你实际上得到CF = 1。 – Jester

+0

减法是在unsigned中完成的,所以不需要知道类型。进位标志通过输出位 –

回答

1

您似乎混淆了进位和溢出标志。
进位标志检查无符号溢出,溢出标志检查有符号溢出。
这种方式的工作原理是在减法之前比较(无符号)数字,如果b> a,则CF被设置。
如果设置了第一个操作数的符号变化溢出。

在减法期间,CPU不关心操作数是否定的。
如果无符号数的基数小于要减去的无符号数,则发生进位。

E.g. (只是在我的调试器的CPU视图测试)

0 - -1 = 1 ->> CF = 1, because 0xFFFFFFFF > 0 
10 - -1 = 11 ->> CF = 1, same reason 
-2 - 4 = -6 ->> CF = 0, because 0x4 < 0xFFFFFFFE 

记住登录算术这些结果是正确的,但在无符号运算它们是* *的方式关闭,因此CF = 1。

进位标志不知道或不关心符号,它(仅)意味着无符号溢出。 请记住,CPU无法知道您是要执行签名还是未签名的操作。测试相关标志以解释结果取决于应用程序,这就是为什么CPU提供两组溢出标志。

这里是最常见的标志及其功能的列表:

code | descripton  |name  | When set 
---+++----------------+---------+------------------- 
CF unsigned overflow Carry  If unsigned over-/underflow occurs 
OF signed overflow Overflow If sign bit (MSB) flips 
SF Sign flag   Sign  If MSB is set, i.e. is result is negative 
ZF Zero flag   Zero  If Result is zero 

,这些标志均不具有“智能”的方式很多。
您需要记住,这些标志是在晶体管供应不足时设计的。

关于2的补
2的补数的设计,使加减法并不需要了解从正到负的转变。
如果操作数或结果是正数或负数,你可以不加小心地加减。
唯一的警告发生在溢出,这正是进位标志测试。

如果你在哪里使用平原反演(即1的补码)作为负数,那么你需要围绕加和减的各种安全措施;这就是为什么2的补码被普遍使用。

延伸阅读
http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt
感谢彼得

+0

对于补码,要减去的数字只是补码(补码)。在添加期间,如果有进位,结果会递增。一些较旧的电脑(如CDC 3000系列)使用补码。 – rcgldr