一、写出下面每条指令执行后,ZF、PF、SF、CF、OF等标志位的值
sub al, al
mov al, 10H
add al, 90H
mov al, 80H
add al, 80H
mov al, 0FCH
add al, 05H
mov al, 7DH
add al, 0BH
答案:
逐条分析
- 1、sub al, al
al = 0
答案:
CF = 0
OF = 0
SF = 0
ZF = 0
PF = 0
- 2、mov al, 10H
al = 10H
答案:传递指令,对标志寄存器没有影响
CF = 0
OF = 0
SF = 0
ZF = 0
PF = 0
- 3、add al, 90H
al = A0H
答案:
CF = 0
a、10H +90H = A0H,对应着10进制值为160。对于无符号数来说,没有进位,所以为0
OF = 0
a、10H对应的10进制值为16,小于127,对应的有符号数也是10H
b、90H对应的10进制值为144,大于127。对应的有符号数 = 256 - 144 = -112。也就是90H是有符号数-112的补码。
c、对于有符号数运算,16 + (-112) = -96
d、没有溢出
SF = 1
a、对于有符号数运算,结果是-96,是负数。所以为1
ZF = 0
a、结果是-96,所以为0.
PF = 1
a、结果是-96。1的个数为偶数,所以为1
96的补码 0110 0000
-96的补码 1010 0000
- 4、mov al, 80H
al = 80H
答案:传递指令,对标志寄存器没有影响
CF = 0
OF = 0
SF = 1
ZF = 0
PF = 1
- 5、add al, 80H
al = 00H
答案:
CF = 1
a、80H + 80H = 256, 对应着10进制值为256。对于无符号数来说,产生进位,所以为1。
b、255 1111 1111
256 1 0000 0000
OF = 1
a、80H对应着无符号数值为128, 对应着有符号数-128。
b、-128 + (-128) = -256,8位寄存器放不下,最小为-128。溢出了1位,al寄存器的值为00,所以OF为1,
SF = 0
a、对于有符号运算结果来说,是负数,所以为1
ZF = 1
a、al寄存器为1,所以为1
PF = 1
a、-256 二进制码 1 0000 0000,8位寄存器中,没有任何1,所以为偶数。所以PF=1
- 6、mov al, 0FCH
al = 0FCH
答案:传递指令,对标志寄存器没有影响
CF = 1
OF = 1
SF = 0
ZF = 1
PF = 1
- 7、add al, 05H
al = 01
答案:
CF = 1
a、0FC表示无符号数252,同时又表示有符号数 -(256-252)= -4。
b、05H表示有(无)符号数5。
c、无符号计算:252 + 5 > 256,借位了,所以CF=1
OF = 0
a、有符号计算:-4 + 5 = 1, 没有溢出,所以OF=0
SF = 0
a、有符号计算:-4 + 5 = 1,不是负数,所以SF = 0
ZF = 0
a、有符号计算:-4 + 5 = 1,不是0,所以ZF = 0
PF = 0
a、有符号计算:-4 + 5 = 1,对应着二进制: 0000 0001, 只有奇数1,所以PF = 0
- 8、mov al, 7DH
al = 7DH
答案:
CF = 1
OF = 0
SF = 0
ZF = 0
PF = 0
- 9、add al, 0BH
al =
答案:
CF = 1
a、7DH表示有(无)符号数125。
b、0BH表示有(无)符号数11。
c、有符号计算: 125 + 11 < 255, 所以为0
OF = 1
a、无符号计算:125 + 11 > 127,溢出了,所以1
SF = 1
a、有符号计算:125 + 11 = 136,136对应着无符号数为-120,是负数,所以SF = 1
ZF = 0
a、因为有符号计算值为-120,不为0,所以ZF =0
PF = 1
a、136,对应着二进制:1000 1000,有偶数个1,所以PF=1
总结:
1、al的值实际是无符号运算的
2、SF的值是CPU对有符号数运算结果的一种记录
3、PF的值是CPU对无符号数运算结果的一种记录
4、CF的值是CPU对无符号数运算结果的一种记录
5、OF的值是CPU对有符号数运算结果的一种记录
6、ZF的值是CPU对无符号数运算结果的一种记录