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

我的博客

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

[2023-06-27 13:19] 第10章 检测点 10.4

检测点 10.4

下面的程序执行后,ax 中的数值为多少?

内存地址    机器码      汇编指令
1000:0     B8 06 00    mov ax,6
1000:3     ff d0      call ax
1000:5     40        inc ax
1000:6              mov bp,sp
                 add ax,[bp]

程序执行过程如下:
1. 在 IP=0 处读取 mov ax,0 指令,由于该指令占用 3 个字节,所以执行 (IP)=(IP)+3=3,然后执行该指令,于是 (ax)=6。
2. 在 IP=3 处读取 call ax 指令,由于该指令占用 2 个字节,所以执行 (IP)=(IP)+2=5,然后执行该指令,即将 IP 压栈:
(sp)=(sp)-2
((ss)*16+(sp))=(IP)=5H
由于 SP 寄存器初始化值为 0,所以执行 (sp)=(sp)-2 的结果使得 (sp)=FFFEh。
然后执行:
(IP)=(ax)=6H
程序跳至 CS:IP = 1000:6 处执行以下指令:
mov bp,sp    ; (bp)=(sp)=FFFEh
add ax,[bp]   ; BP 寄存器用作寻址时,默认段寄存器为 SS,因此指令中的 [bp] 就是 ss:[bp]。SS:BP 地址存储的就是刚刚压入栈中的值 5H,于是 (ax)=(ax)+ss:[bp]=06H+05H=0BH        
可见,程序执行后,AX 寄存器中存储的数据值为 000BH。
评论次数(0)  |  浏览次数(154)  |  类型(汇编作业) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码