关于汇编的标志寄存器

来源:百度知道 编辑:UC知道 时间:2024/07/07 04:04:10
CF OF SF ZF PF
sub al,al 0 0 0 1 1
mov al,10h 0 0 0 1 1
add al,90h 0 0 1 0 1
mov al,80h 0 0 1 0 1
add al,80h

问题在第5条....执行完第4条后al的值为10000000现在执行第5句相当于:
①al=10000000+10000000执行完后al=100000000
如果看成无符号数确实像前进了一位则CF=1
但是如果看成是有符号数则①处应该看成al=0000000+0000000并没有进位呀?
怎么会答案上OF=1呢

这个OF代表的溢出指的是如果把数据当成有符号数的话,结果如果超出能表示的范围的话,则结果溢出
那么多少是溢出呢?
首先看一下有符号数能表示的范围
在把数据看成有符号数的情况下,数据是被看作补码的,00000000B-011111111B为正数其值和原来的值一样,10000000B-11111111B为负数,10000000B最小,是-128,11111111B最大,是-1
所以说如果把数据看成是有符号数的话,在8位的情况下能表示的范围是-128~127
所以楼主的10000000B+10000000B如果看成是有符号数的话,是-128-(-128)=-256,这个-256小于-128,超出了8位有符号数所能表示的范围,所以发声了溢出

mov al,80h;执行后保持前面的标志寄存器的值
add al,80h

作为无符号时,结果al为'1'00H当然进位了CF=1
作为无符号时,80H>7FH 即80H作为补码要看作-128
add al,80H后 -128+(-128)=-256<-128 所以溢出OF=1

反正你就记住,加错了就会有CF/OF

如果结果对于无符号不对CF=1
如果结果对于有符号不对OF=1
80h-〉有符号= -128
-128 + -128 应当= -256
显然-256是放不到al里面的
-------------------------------------------
CF的算法不介绍了,OF这样计算
1000 0000
+ 1000 0000
-------------
1 0000 0000
进位(两位)为01,10时,OF=1 (本例为10)
进位(两位)为00,11时,OF=0
---------------------------------
如果两个数相加,计算两个进位,前一个是CF,后面一个就是最高位
如果最高位和CF相同OF=0,否则OF=1

1100 0