| 
注册时间2005-6-29
阅读权限255
最后登录1970-1-1UID2198 副坛主   
 
 该用户从未签到 | 
 
| 这两天用到标志寄存器,发现之前写的汇编学习笔记混乱,所以现在重新阐述一下: 内存中的数据可以作为有符号数也可以作为无符号数来使用。我们比较内存中的两个数值,一定是以下三种结果:
 
 一、相等情况:
 A - B = 0 ; 我们用标志位 ZF 来记录结果,如果(比较)结果为0 则设置 ZF=1,反之设置 ZF=0;
 
 二、不等情况:
 A - B > 0 或者 A - B < 0
 我们只讨论大于情况,因为小于情况条件取反即可。
 
 1. 若 A 和 B 为无符号数
 0x60 - 0x20 = 0x40 无需借位
 0x20 - 0x60 = 0xC0 借位(0x120 - 0x60 = 0xC0)
 若无借位,CF = 0,则则可判断 A > B
 
 2. 若 A 和 B 为有符号数
 0x50 - 0x30 = 0x20 结果为正,是否可以判断其大小?
 0x50 - (-0x80)= 0xD0
 0xD0 ==> 1101 0000 最高(左)位为1,为负数 SF=1
 负数变正数的算法是取反后+1,即0010 1111 + 1 = 0011 0000 = 30
 0x50 - (-0x80)= -0x30 即十进制 -48
 正数A - 负数B,肯定是 A > B ,但是从结果来看,结果为负数,所以结果的正负就不能判断有符号数 A 和 B 的大小了。
 
 那什么情况下会出现溢出这种情况呢:
 超过上限:正 - 负 (正 + 正)
 超过下限:负 - 正 (负 + 负)
 那我们来统计一下:
 溢出(1) 正负
 OF=0   SF=0(正0)  ==> A > B
 OF=0   SF=1(负1)  ==> A < B
 OF=1   SF=1(正-负)  ==> A > B
 OF=1   SF=0(负-正)  ==> A < B
 
 所以,对于两个不相等的有符号数,当 SF = OF 时, A > B ,当 SF != OF 时, A < B  。
 
 综上所述,这就是 ZF,CF,SF,OF 四个标志寄存器存在即合理的由来,相信你对其也有了更本质的了解。
 
 
 | 
 |