检测点 11.4
下面的程序执行后,(ax)=?
mov ax,0
push ax
popf
mov ax,0FFF0h
add ax,0010h
pushf
pop ax
and al,11000101B
and ah,00001000B
分析:
1. 观察指令
mov ax,0
push ax
popf
这三条指令使得 flag 各位均为 0。
2. 观察指令
mov ax,0FFF0h
add ax,0010h
pushf
(ax)=FFF0h+0010h=(1)0000h,也即 (ax)=-16+16=0,这影响了 flag 的 OF、SF、ZF、PF、CF 位:
OF=0(第 11 位),SF=0(第 7 位),ZF=1(第 6 位),PF=1(第 2 位),CF=1(第 0 位)
而由于前述三条指令使得 flag 各位均为 0,所以此时 flag 各位的值如下:
0000 0000 0100 0101
此处的 pushf 将上述 flag 各位压入栈中。
3. 观察指令
pop ax
and al,11000101B
and ah,00001000B
“pop ax”指令使得 (ax)=0000000001000101B,即 (al)=01000101B,(ah)=00000000B。
最后两行指令的 and 运算使得 (al)=01000101B,(ah)=00000000B,保持 (ax) 原值。
所以最终 (ax)=0000000001000101B=0045H=69。