题目:下面的程序执行后,ax的值是多少?
assume cs:codesg
datasg segment
db 16 dup(0)
datasg ends
codesg segment
start:
mov ax,0
push ax
popf
mov ax,0fff0h
add ax,0010h
pushf
pop ax
and al,11000101b
and ah,00001000b
mov ax,4c00h
int 21h
codesg ends
end start
这题是对第十一章标志寄存器的更好理解。
先上个图:
本题关键在于OF 标志的判断。另一个关键点是and 0000 0100 1100 0101 起到了屏蔽未学习位的作用!
一步一步来分析:
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: 假设