鱼C论坛

 找回密码
 立即注册
查看: 11764|回复: 4

[技术交流] 汇编语言的进位和溢出标志

[复制链接]
发表于 2014-8-13 15:08:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
关于汇编语言的进位和溢出,有时候容易糊涂,这里特地开个帖子和大家交流。
溢出标志OF和进位标志CF是两个意义不同的标志。
进位标志表示无符号运算结果是否超出范围,超出范围产生则进位,CF置位,注意运算结果是正确的。比如8个二进制位可以表示的无符号整数范围是0+255,运算结果超出了这个范围则产生进位。
例如:
4AH+8BH=D5H,就是74+139=213,没有超出范围,不产生进位。
AAH + 7CH=(126H,即170+124=294,超出范围,产生进位,进位移至CF
可以看出,产生进位后运算结果是正确的。
溢出标志表示有符号运算结果是否超出范围,超出范围则溢出,OF置位,溢出是一种错误的运算结果,计算机产生溢出会发生意想不到的结果。有符号数在处理器内部是以补码的形式表示的。
给定补码计算其十进制数就是将最高位做为符号位和其余低位相加(按权分配)。
举几个例子:
0001= -0*2^3+0*2^2+0*2^1+1*2^0= 1
1011= -1*2^3+1*2^2+1*2^1+1*2^0= -5
1111= -1*2^3+1*2^2+1*2^1+1*2^0= -1
因此8位的二进制位可以表示的有符号整数范围是1000 00000111 1111-128+127。运算结果超出这个范围了就产生溢出,结果就会错误。
同样跟上面的例子对比:
AAH + 7CH=(126H,即-86+124=28,范围内,不溢出。
AAH + 8CH=(1)36H,即-86+(-116)=-202,范围外,溢出,此时计算机算出的结果是36H,为正数,结果明显错误。
处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志CF;同时,根据是否超出有符号数的范围设置溢出标志OF
判断运算结果是否溢出有一个简单的规则:当两个相同符号数相加,而运算结果的符号与原数据符号相反时,产生溢出;因为,此时的运算结果显然不正确。其他情况下,则不会产生溢出。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-5 21:48:59 | 显示全部楼层
请问:mov al,0f0h
      add al,88h    cf?  of?

还有:MOV al,f0h
        add al,78h    cf?   of?           我觉得这两个的结果是一样的吧,是吗?  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-10-5 21:49:30 | 显示全部楼层
15801861509 发表于 2014-10-5 21:48
请问:mov al,0f0h
      add al,88h    cf?  of?

麻烦解释下吧,我是新手。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-10-5 21:57:37 | 显示全部楼层
0f0h=负16     78h=负136     f0h+78h  应该溢出啊,OF=1   对吗?请指教。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-5 22:38:23 | 显示全部楼层
15801861509 发表于 2014-10-5 21:57
0f0h=负16     78h=负136     f0h+78h  应该溢出啊,OF=1   对吗?请指教。

0x1. mov al,0f0h   add al,88h    cf=1  of=1
0x2. :mov al,f0h   add al,78h    cf=1   of=0      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-11 23:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表