王爽汇编语言 检测点11.4

王爽汇编语言 检测点11.4_第1张图片
这里写图片描述
下面开始分析程序
mov ax,0 将ax置0
push ax ax入栈
popf 将栈中的数据弹出到psw(标志寄存器)中
此时psw中数据为:0000 0000 0000 0000b

mov ax,0fff0h
add ax,0010h
这两句的作用是(ax) = fff0h + 0010h,显然,psw中的数据会发生改变,问题是:如何改变呢?下面我们一一分析。
CF: 假设这里是无符号运算,则1111 1111 1111 0000b(fff0h) + 0000 0000 0001 0000b(0010h) = 1 0000 0000 0000 0000b,已经发生了进位,所以CF = 1
PF: 结果保存在ax中,ax=0000h,’1’的个数是0,是偶数,所以PF标志=1
AF: AF没学,先不管,假设它是个不确定值,AF = ?
ZF: 结果是0,显然ZF = 1
SF: 结果是0,不是负数,所以SF = 1
TF: TF没学,先不管,假设它是个不确定值,AF = ?
IF: IF没学,先不管,假设它是个不确定值,AF = ?
DF: DF为方向标志位,add指令不会影响DF,前面已经将psw置0,所以DF = 0
OF: OF(溢出标志位)对初学者来说是最难的了,OF记录了有符号数运算结果是否溢出。那么,如何判断是否溢出呢?
假设是有符合运算,fff0h(1111 1111 1111 0000b)对应的原码是1000 0000 0001 000b(即十进制-16),这是如何算出来的?很简单:先看符号位1,说明是个负数,然后所有位取反再加1(即0000 0000 0001 0000b)得绝对值,前面确定是负数,所以符号位应该是1,则原码为1000 0000 0001 000b,同样,0010h的源码(正数的补码和原码相同)是0000 0000 0001 0000b(即十进制的16),显然,结果是0,一个正数一个负数相加,结果肯定不会溢出!!!下面给出一个tip,用来快速判断运算是否溢出:
tip: 正加正得负,负加负得正,肯定溢出
一正一负相加肯定不会溢出
(进行正加正,负加负运算时,可以全部转为十进制来看,如果得到正加正得正,负加负得负,则需看他们结果是否在可表示范围内)
通过说明的tip,立刻可以判断出未溢出,所以OF = 0;
所以:运行完上面两条语句后,psw值为: 0000 00?? 010? 0101b

pushf 将psw的值入栈
pop ax 此时ax即: 0000 00?? 010? 0101b

and al,11000101b
and ah,00001000b
and的是按位与,运算法则是:有0则0,我们写对齐来看
0000 00?? 010? 0101b
0000 1000 1100 0101b
显然and以后ax = 0000 0000 0100 0101b = 45h

总结:本题关键在于OF 标志的判断。另一个关键点是and 0000 0100 1100 0101 起到了屏蔽未学习位的作用!

你可能感兴趣的:(汇编)