下面是我总结出来的标志位的判断方法。我也不知道对不对,是否实用。但至少目前为止还没错过,所以先写出来,希望高手能够指点一下。我也希望能够有更简便的判断方法,希望知道的人能够告诉我一下,谢谢。
1.OF位的判断
溢出,只是对有符号数运算而言。因此,我们在讨论溢出(或者说在判断OF的值)的时候,应将对象看为有符号数,其最高位为符号位。
对于8位数而言,由于其最高位为符号位,故它所能表示的十进制数范围为[-128,127]。
现在,要判断是否溢出,就将对象全部转化为十进制数,然后再进行运算(加减乘除)。看运算后所得的结果是否在[-128,127]之间,如果不在,就发生了溢出,OF=1。
(1)对于已经是十进制的数,直接运算后看是否在[-128,127]之间即可。
eg.
mov al,98
add al,99
98+99=197>127 溢出 OF=1
(注:此时上面的98和99是看做有符号数的。也可看为无符号数,但那是在判断CF的时候用到的:在判断CF的时候,十进制范围为[-256,255],98+99=197<255 无进位 CF=0)
(2)对于不是十进制数的,先转化为十进制,然后按(1)所介绍的方法再计算判断即可。
eg.
mov al,0f0h
add al,88h
0f0h=-16D,88h=-120D,-16+(-120)=-136<-128 溢出 OF=1
mov al,80h
add al,80h
80h=-128D,-128+(-128)=-256<-128 溢出 OF=1
mov al,0fch
add al,05h
0fch=-4D,05h=5D,-4+5=1<127 不溢出 OF=0
mov al,7dh
add al,0bh
7dh=125D,0bh=11D,125+11=136>127 溢出 OF=1
2.CF位的判断
CF是对无符号数运算而言的。因此我们在讨论CF的值的时候,应将对象看为无符号数。
对于8位数而言,它所能表示的十进制数范围为[-256,255]。
现在,要判断是否进位或借位,就将对象全部转化为十进制数,然后再进行运算(加减乘除)。看运算后所得的结果是否在[-256,255]之间,如果不在,就发生了进位或借位,CF=1。
(1)对于已经是十进制的书,直接运算后看是否在[-256,255]之间即可。
(2)对于不是十进制数的,先转化为十进制,然后按(1)所介绍的方法再计算判断即可。
eg.
mov al,0f0h
add al,88h
0f0h=240D,88h=136D,240+136=376>255 进位 CF=1
mov al,80h
add al,80h
80h=128D,128+128=256>255 进位 CF=1
mov al,0fch
add al,05h
0fch=252D,05h=5D,252+5=257>255 进位 CF=1
mov al,7dh
add al,0bh
7dh=125D,0bh=11D,125+11=136<255 无进位 CF=0