当减数量较大时,如何设置进位标志?

时间:2017-01-25 01:06:08

标签: assembly x86 masm cpu-architecture digital-logic

我知道只要minuend小于减数并且需要借用,就会设置SUB期间的Carry标志,但是找不到任何更详细的解释。

由于减法实际上只是添加了两个补码,CPU如何知道减数更大并且已经发生了借位?

我唯一能想到的是,只要将减数转换为2的补码,就可以在SUB期间自动设置进位标志。然后,除非另一个Carry发生(因为它应该在添加期间,只要minuend大于减数)将其关闭,它就会保持开启状态。

或者我离开了?

1 个答案:

答案 0 :(得分:2)

你好像混淆了携带和溢出标志 进位标志检查无符号溢出,溢出标志检查有符号溢出 这种方法的工作方式是在减法之前比较(无符号)数字,如果b>然后设置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
谢谢Peter