小靚同学Leon 发表于 2014-8-13 15:08:58

汇编语言的进位和溢出标志

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

15801861509 发表于 2014-10-5 21:48:59

请问:mov al,0f0h
      add al,88h    cf?of?

还有:MOV al,f0h
      add al,78h    cf?   of?         我觉得这两个的结果是一样的吧,是吗?

15801861509 发表于 2014-10-5 21:49:30

15801861509 发表于 2014-10-5 21:48
请问:mov al,0f0h
      add al,88h    cf?of?



麻烦解释下吧,我是新手。

15801861509 发表于 2014-10-5 21:57:37

0f0h=负16   78h=负136   f0h+78h应该溢出啊,OF=1   对吗?请指教。

小靚同学Leon 发表于 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=1of=1
0x2. :mov al,f0h   add al,78h    cf=1   of=0      

snamp 发表于 2024-9-19 09:40:04

15801861509 发表于 2014-10-5 21:57
0f0h=负16   78h=负136   f0h+78h应该溢出啊,OF=1   对吗?请指教。

78h=120
页: [1]
查看完整版本: 汇编语言的进位和溢出标志