为什么没有设置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 编辑 ] 两个 8 位数进行运算,有借位或进位情况发生时,只会对 AC(辅助进位) 标志位有影响,不会影响到 CF 标志 2楼的回答不对。
55H=01010101,3EH=00111110。做减法,是先将减数求补(不是求补码,是连符号位一起求反,再加1),得11000010,再相加的。
为了解决溢出问题,在CPU里,一般采用双符号位做加法:
001010101
+)111000010
---------
1000010111
符号位产生的进位被丢弃。去掉一个符号位,最后得00010111。
根本没有加/借位,CF当然不用置位。 为了解决溢出问题,在CPU里,一般采用双符号位做加法:
001010101
+)111000010
---------
1000010111
有根据么? 有8位数值中不存在溢出问题
x86 的运算指令中没有 signed 与 unsiged 之分,
当看成是 signed 运算时,置 OF(溢出标志位)以指示溢出
当看成是 unsigned 运算时,置CF(进位标志)以指示溢出 原帖由 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上去,就会搞糊涂了。 原帖由 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 的实现大多数并不是这样的 你看看CPU做加法如何判断溢出吧。
我学的早,过去是用的变形码。现在可能不同了。 原帖由 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. 原帖由 beepbug 于 2007-4-20 12:14 发表于 5楼
8位CPU,ALU一般是9位。16位的,ALU一般是17位。
在CPU里,一般是用变形码(使用两位相同的符号位)来判断是否溢出。当结果的 ...
你说的这个判断是一种方法,但大多数 CPU 以标志位代替,
X86 就是典型的以标志位来判断溢出,而不是你说的 ALU 加1位 原帖由 mik 于 2007-4-22 21:49 发表于 9楼
你说的这个判断是一种方法,但大多数 CPU 以标志位代替,
X86 就是典型的以标志位来判断溢出,而不是你说的 ALU 加1位
哪谁来设置标志位呢?标志位自己判别的?你把概念搞混了。
先要有判断。按照判别,设置标志位。设置标志位,是为了告诉后续操作或其它部件(譬如陷阱),这次计算发生了溢出。
当然变形码并非唯一做法。我知道还有一种逻辑判断方法,在很早的计算机里用过。但是,逻辑判断会大大降低CPU的速度。
用变形码的好处是,计算和溢出判断是同步的。由上面的例子可知,计算完成了,溢出结果也出来。溢出判别没有带来额外的时间开销。
这种比较深入的问题,你要看老一点的原理书。
页:
[1]
2