免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6515 | 回复: 12
打印 上一主题 下一主题

为什么没有设置CF? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-10 20:01 |只看该作者 |倒序浏览
这个帖子刚才发在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





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

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

论坛徽章:
0
2 [报告]
发表于 2007-03-10 23:10 |只看该作者
两个 8 位数进行运算,有借位或进位情况发生时,只会对 AC(辅助进位) 标志位有影响,不会影响到 CF 标志

论坛徽章:
0
3 [报告]
发表于 2007-04-16 12:52 |只看该作者
2楼的回答不对。
55H=01010101,3EH=00111110。做减法,是先将减数求补(不是求补码,是连符号位一起求反,再加1),得11000010,再相加的。
为了解决溢出问题,在CPU里,一般采用双符号位做加法:
  001010101
+)111000010
---------
  1000010111
符号位产生的进位被丢弃。去掉一个符号位,最后得00010111。
根本没有加/借位,CF当然不用置位。

论坛徽章:
0
4 [报告]
发表于 2007-04-17 22:28 |只看该作者
为了解决溢出问题,在CPU里,一般采用双符号位做加法:
  001010101
+)111000010
---------
  1000010111


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

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

论坛徽章:
0
5 [报告]
发表于 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上去,就会搞糊涂了。

论坛徽章:
0
6 [报告]
发表于 2007-04-20 13:55 |只看该作者
原帖由 beepbug 于 2007-4-20 12:14 发表于 5楼  

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


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

8位CPU,ALU一般是9位。16位的,ALU一般是17位

偶先了解了解这方面的资料

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

论坛徽章:
0
7 [报告]
发表于 2007-04-22 21:14 |只看该作者
你看看CPU做加法如何判断溢出吧。
我学的早,过去是用的变形码。现在可能不同了。

论坛徽章:
0
8 [报告]
发表于 2007-04-22 21:36 |只看该作者
原帖由 beepbug 于 2007-4-22 21:14 发表于 7楼  
你看看CPU做加法如何判断溢出吧。
我学的早,过去是用的变形码。现在可能不同了。


汗~~~

你自己看

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


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

论坛徽章:
0
9 [报告]
发表于 2007-04-22 21:49 |只看该作者
原帖由 beepbug 于 2007-4-20 12:14 发表于 5楼  
8位CPU,ALU一般是9位。16位的,ALU一般是17位。
在CPU里,一般是用变形码(使用两位相同的符号位)来判断是否溢出。当结果的 ...


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

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

论坛徽章:
0
10 [报告]
发表于 2007-04-26 21:04 |只看该作者
原帖由 mik 于 2007-4-22 21:49 发表于 9楼  
你说的这个判断是一种方法,但大多数 CPU 以标志位代替,
X86 就是典型的以标志位来判断溢出,而不是你说的 ALU 加1位


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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP