. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->标志寄存器
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  cpu如何判断加法是否溢出  [已解决] 回复[ 3次 ]   点击[ 692次 ]  
jizha
[帖 主]   [ 发表时间:2008-12-06 10:20 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-10-27 20:01
如题,在书上的例子中
mov al,0f0h
add al,088h
书上说指令执行后:cf=1,of=1,对于cf我没有什么问题,但对于of我就弄不懂了
因为执行的过程用二进制表示如下:
  11110000
+10001000
-——————                        
 01111000 即78h
那问题就来了,如何判定这个结果是溢出的呢?
我在论坛都简单的看了下,总不至于每次我都要把他们转化为10制计算一下结果再来判断是否溢出吧?
比如这题,我要先都转化为十进制,为-16+(-120)=-136,这时我才知道它溢出了,
那有没有更简单的方法来判别呢?就从它的计算过程来判断呢?

还有一个相关的问题:
cpu是如何区分运算是有符号数运算和无符号数运算的呢?
因为有符号数和无符号数运算方式就不一样,有符号数的最高位,如第七位,是不参与运算的,而无符号数的所有位都参与运算,而cpu又是如何让它们最后的结果正确的呢?
我找了一下add指令的解释,如下:
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.
也没有找到我想要的答案,希望有人可以指点一下!先谢谢了!
mouse
[第1楼]   [ 回复时间:2008-12-06 14:51 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
那问题就来了,如何判定这个结果是溢出的呢? 
我在论坛都简单的看了下,总不至于每次我都要把他们转化为10制计算一下结果再来判断是否溢出吧? 
-----------
这个正式第十一章的内容,标志寄存器,俩面有一位就是标识溢出。
建议楼主自己理解十一章的内容,分析一下自己的问题

加油吧~
jizha
[第2楼]   [ 回复时间:2008-12-07 12:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-10-27 20:01
这两天一直在想这两个问题,仔细看过书和相关资料后终于弄通了!呵呵!
先自己回答一下第一个问题:
针对有符号数,CPU只要在运算结束后比较一下最高位符号位是否产生变化就能判定溢出情况了!
比如:
 11110000 
+10001000 
-——————                         
 01111000 即78h
运算前,两个操作数最高位都为1,证明都是负数,而运算结果的最高位为0,符号位产生了变化,这就证明运算溢出了!
当然这种判断只局限于(正数+正数)和(负数+负数)的运算,因为(正数+负数)是不会产生溢出的,所以CPU根本就不用进行判断。

第二个问题:
CPU在运算过程中是不区分有符号数和无符号数的,它只知道把所有的位都给加一遍,当然也包括所谓的符号位。运算结果出来以后再使用上面说到的办法判断是否溢出和进位了,设置相应的OF和CF!
所以当时我就犯了一个错误,符号位是参与运算的!
谢谢mouse的指点!
jizha
[第3楼]   [ 回复时间:2008-12-08 10:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-10-27 20:01
此贴由 贴主 于 [ 2008-12-08 10:33 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved