[Hb-II] push pop指令 中断时CPU的工作(中断的入栈操作)

《汇编语言·第三版》--王爽


1 读程序填空

使用Debug,将下面的程序写入内存逐条执行,根据指令执行后的实际运行情况填空。

1.        mov    ax, ffff

2.        mov    ds, ax

3.        mov    ax, 2200

4.        mov    ss, ax

5.        mov    sp, 0100

6.         

7.        mov    ax, [0]        ;ax =

8.        add     ax, [2]        ;ax =

9.        mov    bx, [4]        ;bx =

10.    add    bx, [6]        ;bx =

11.     

12.    push    ax          ;sp = 0xfe ;修改的内存单元的地址是2200:fe内容为ax(C0FCH)

13.    push    bx          ;sp = 0xfc;修改的内存单元的地址是2200:fc内容为bx(6021H)

14.    pop     ax           ;sp = 0xfe;ax = bx(6021H)

15.    pop     bx           ;sp = 0x100;bx=ax(C0FCH)

16.     

17.    push    [4]           ;sp = 0xfe;修改的内存单元的地址是ffff:[4]内容为30F0H

18.    push    [6]           ;sp = 0xfc;修改的内存单元的地址是ffff:[6]内容为6021H-30F0H
[以上结果未验证]

因为不知道数据段DS:[0]内的内容(可用d ds:0内存单元的值)。敲入代码看执行结果:


Figure1. 从073F:0100内存地址处敲入汇编指令


Figure2.  1~5行指令的执行


Figure3. 从未初始化的数据段中取值结果

此时,就算之前没有用d ds:0命令查看内存单元中的值也能够判断后续语句的执行结果了,回见代码填空处。


2 分析汇编程序执行结果

观察下图的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?


Figure4. 保护现场

答:Debug用单步中断来实现t命令的功能,用t命令执行一条指令后,CPU响应单步中断,执行Debug设置好的程序,才能在屏幕上显示寄存器的状态,并等待命令的输入。而在mov ss, ax后,CPU根本就不响应任何中断,其中也包括单步中断,所以Debug设置好的用来显示寄存器状态和等待输入命令的中断处理程序根本没有得到执行,所以我们看不到预期的结果。CPU接着向下执行mov          sp, 10,然后响应单步中断。


单步中断发生时,CPU将进行以下工作:

  • 取得中断类型码
  • 标志寄存器入栈,TF、IF设置为0
  • CSIP入栈
  • (IP) = (N * 4),(CS) = (N * 4 + 2)

2000:0~2000:f栈中的内容是CPU响应单步中断时的入栈值。


[2014.12.19 - 11:26]
R《Hb》Note Over.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值