《汇编语言·第三版》--王爽
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
- CS、IP入栈
- (IP) = (N * 4),(CS) = (N * 4 + 2)