下面是我总结出来的标志位的判断方法。我也不知道对不对,是否实用。但至少目前为止还没错过,所以先写出来,希望高手能够指点一下。我也希望能够有更简便的判断方法,希望知道的人能够告诉我一下,谢谢。
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
3.其它标志位的判断
其它标志位可以在判断OF的时候,将运算所得的结果化为二进制,然后判断这些标志位。
- [游客] <a href="http://www.playren.com/">整人方法</a> 12/21 17:12
- [游客] 入门也有高低,尤其是学习应用知识的思维很重要。 08/17 09:28
- [游客] 到目前为止学过了jcxz,可以用这个指令判断字符串末尾。学到了第十一章会学到更多的条件跳转指令了 ^ 08/17 09:26
- [sleepinglion] 我错了,前面的书没仔细看。这个程序的第一个大缺点就是通用性很差。因为如果用loop循环,显然得计算字 07/30 23:55
- [qiu0305] 哥们你很厉害 07/28 19:49
- [sleepinglion] 下午实在是太冲动了,不该贴出来,不够灵活。我会抽空优化的。 07/27 16:16
- [masmaster] 简单的方法, 定义一个数据段就可以啦,用相对寻址方式:比如: s: mov ah,[bx] 07/23 10:13