- UID
- 2198
注册时间2005-6-29
阅读权限255
最后登录1970-1-1
副坛主
该用户从未签到
|
这两天用到标志寄存器,发现之前写的汇编学习笔记混乱,所以现在重新阐述一下:
内存中的数据可以作为有符号数也可以作为无符号数来使用。我们比较内存中的两个数值,一定是以下三种结果:
一、相等情况:
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 四个标志寄存器存在即合理的由来,相信你对其也有了更本质的了解。
|
|