汇编网首页登录博客注册
unixandlinux的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新评论
最新留言
好友圈
友情链接

[2023-08-01 17:30] 第 11 章 检测点 11.4

检测点 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。
评论次数(0)  |  浏览次数(109)  |  类型(汇编作业) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码