janusle 发表于 2007-03-10 20:01

为什么没有设置CF?

这个帖子刚才发在C/C++板块,然后被langue移动到这里。或许是论坛的BUG,帖子并没有显示到这里,所以重新发一下
嘿嘿~



是这样的,如果有两个数相减
55H-3EH
然后计算机内部是以补码储存这两个数


   01010101   
+11000010
------------------
(1)00010111

也就是说有进位,照例应该设置CF标志,将其设为CY(1)

但是我debug了一下,看到上面两个数字相加之后,CPU并没有设置CF标志,CF值为NC

这个是为什么?

我是这么做的
在debug里面
使用如下代码
mov al , 55
sub al , 3E


http://www.shng.cn/hearson/Janus_Le/noname.bmp


右下角那一排NV UP EI PL NZ AC PE NC
是标志寄存器的值。其中最右边的那个NC是CF的标志。NC表示没有进位。

[ 本帖最后由 janusle 于 2007-3-10 20:03 编辑 ]

mik 发表于 2007-03-10 23:10

两个 8 位数进行运算,有借位或进位情况发生时,只会对 AC(辅助进位) 标志位有影响,不会影响到 CF 标志

beepbug 发表于 2007-04-16 12:52

2楼的回答不对。
55H=01010101,3EH=00111110。做减法,是先将减数求补(不是求补码,是连符号位一起求反,再加1),得11000010,再相加的。
为了解决溢出问题,在CPU里,一般采用双符号位做加法:
  001010101
+)111000010
---------
  1000010111
符号位产生的进位被丢弃。去掉一个符号位,最后得00010111。
根本没有加/借位,CF当然不用置位。

mik 发表于 2007-04-17 22:28

为了解决溢出问题,在CPU里,一般采用双符号位做加法:
  001010101
+)111000010
---------
  1000010111


有根据么? 有8位数值中不存在溢出问题

x86 的运算指令中没有 signed 与 unsiged 之分,
当看成是 signed 运算时,置 OF(溢出标志位)以指示溢出
当看成是 unsigned 运算时,置CF(进位标志)以指示溢出

beepbug 发表于 2007-04-20 12:14

原帖由 mik 于 2007-4-17 22:28 发表于 4楼
有根据么? 有8位数值中不存在溢出问题
x86 的运算指令中没有 signed 与 unsiged 之分,
当看成是 signed 运算时,置 OF(溢出标志位)以指示溢出
当看成是 unsigned 运算时,置CF(进位标志)以指示溢出
这个不是C题吧?不要把这题套到C上面去。楼主可能也是因为把它套到C上面去了,才有这疑问吧?
我的根据是任何一本计算机原理书。
在CPU里,一般是用变形码(使用两位相同的符号位)来判断是否溢出。当结果的符号位是00(正)或11(负)时,没有溢出。01时是正溢出,10时是负溢出。
计算时,最高位的进位被丢弃(模2原则)。这不是溢出。
8位CPU,ALU一般是9位。16位的,ALU一般是17位。
套到C上去,就会搞糊涂了。

mik 发表于 2007-04-20 13:55

原帖由 beepbug 于 2007-4-20 12:14 发表于 5楼

这个不是C题吧?不要把这题套到C上面去。楼主可能也是因为把它套到C上面去了,才有这疑问吧?
我的根据是任何一本计算机原理书。
在CPU里,一般是用变形码(使用两位相同的符号位)来判断是否溢出。当结果的 ...

:em06: 怎么会认为偶在套 C 呢,莫非是 unsigned 与 signed 之故,这可不是 C 的专用词

8位CPU,ALU一般是9位。16位的,ALU一般是17位
偶先了解了解这方面的资料:oops:

你看的是计算机原理书,实际上 ALU 的实现大多数并不是这样的

beepbug 发表于 2007-04-22 21:14

你看看CPU做加法如何判断溢出吧。
我学的早,过去是用的变形码。现在可能不同了。

mik 发表于 2007-04-22 21:36

原帖由 beepbug 于 2007-4-22 21:14 发表于 7楼
你看看CPU做加法如何判断溢出吧。
我学的早,过去是用的变形码。现在可能不同了。

汗~~~

你自己看

Intel 的文档:
The ADD instruction performs integer addition. It evaluates the result for both signed
and unsigned integer operands and sets the OF and CF flags to indicate a carry (overflow)
in the signed or unsigned result, respectively. The SF flag indicates the sign of
the signed result.

AMD 的文档:
This instruction evaluates the result for both signed and unsigned data types and sets the OF and CF
flags to indicate a carry in a signed or unsigned result, respectively. It sets the SF flag to indicate the
sign of a signed result.

mik 发表于 2007-04-22 21:49

原帖由 beepbug 于 2007-4-20 12:14 发表于 5楼
8位CPU,ALU一般是9位。16位的,ALU一般是17位。
在CPU里,一般是用变形码(使用两位相同的符号位)来判断是否溢出。当结果的 ...

你说的这个判断是一种方法,但大多数 CPU 以标志位代替,

X86 就是典型的以标志位来判断溢出,而不是你说的 ALU 加1位

beepbug 发表于 2007-04-26 21:04

原帖由 mik 于 2007-4-22 21:49 发表于 9楼
你说的这个判断是一种方法,但大多数 CPU 以标志位代替,
X86 就是典型的以标志位来判断溢出,而不是你说的 ALU 加1位

哪谁来设置标志位呢?标志位自己判别的?你把概念搞混了。
先要有判断。按照判别,设置标志位。设置标志位,是为了告诉后续操作或其它部件(譬如陷阱),这次计算发生了溢出。
当然变形码并非唯一做法。我知道还有一种逻辑判断方法,在很早的计算机里用过。但是,逻辑判断会大大降低CPU的速度。
用变形码的好处是,计算和溢出判断是同步的。由上面的例子可知,计算完成了,溢出结果也出来。溢出判别没有带来额外的时间开销。
这种比较深入的问题,你要看老一点的原理书。
页: [1] 2
查看完整版本: 为什么没有设置CF?