汇编语言中的溢出问题

gchz1990 2011-02-15 04:18:08
汇编语言中的溢出问题 书上说:执行一下指令:
mov al,0f0H
add al,78h 后标志寄存器CF=1,OF=0 ...求解释
自己的疑惑如下:0f0H即:-16补码。78H即:-136补码。这个-136 已经超出了“-128~127的数值范围” 接下来又该怎样判断是否溢出?!
自己还有一种解释:0f0H与78H相加得:168H即为-104补码,通过这样似乎可以判断没有溢出,但觉得怪怪的。。。
另外:想问一下,汇编中为什么会有CF只针对无符号的运算,OF只针对有符号的运算?解答一下,或者推荐一下资料看看!
...全文
512 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
gchz1990 2011-02-27
  • 打赏
  • 举报
回复
恩,我明白了
回答:
1.OF:有符号运算是否溢出 CF:无符号运算是否有进位
但 计算机事先并不知道 进行的是无符号运算还是有符号运算
所以,就有了两个 用于 标记是否进位的 标志寄存器:OF专注于有符号运算;CF专注于无符号运算!
2.判断OF:要把操作数当作是有符号的,即要把“0f0H”、“88H”当作是补码数(最高位用来表示正负!)。
0f0H--11110000B(最高位是1,说明代表负数)加1、再取反的原码--00010000B,也就是-16D。
78H--01111000B(最高位是0,说明代表正数),既然是正数,那它的源码是它本身01111000B,也就是+120D。
好了,现在两者相加为+104D,没有溢出。
故OF=0
3.判断CF:要把操作数当作无符号的,0f0H+78H=168H,进了一位
故:CF=1
zara 2011-02-15
  • 打赏
  • 举报
回复
78h 不能认为是 -136 的补码,它应该是 +120 。判断是否溢出,自己手工的话,先看两数是否同符号;不一样,即一正数一负数,相加显然是不会溢出的;如果一样,看结果的符号是否和源一样,一样,正常,不一样即意味着溢出了。如果是机器内部判断,就是看运算时最高位向 CF 的进位,是否和次高位向最高位的进位一致;一致,结果正常,没溢出;不一致,结果溢出。

>> 汇编中为什么会有CF只针对无符号的运算,OF只针对有符号的运算?
这个,可以说是就这么设计的。设计成什么样子,是根据使用需要来的。既然存在有非符号数和带符号数,就该有各自的是否溢出的判别方法了。这个问题,暂时别深究吧,放下,继续向后看就是。

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧