1、预备知识:Debug的使用
(略)
2、实验任务
(1)使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行的实际情况填空
(详细图解在实验结果中)
特别说明:由于笔者的实验环境是在Win98(虚拟机)上进行实验的,有些同学是在DOSBOX上进行实验的。不同机器的ROM配置可能不相同,因此 FFFF:0000~0000F 这一段的信息可能不相同,因此实验结果不尽相同。但只要是正确的操作,答案都是正确的
mov ax,ffff
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax,[0] ; AX = 19CDH (答案不唯一) FFFF:0 = 19CDH
add ax,[2] ; AX = 1AADH (答案不唯一) FFFF:2 = 00E0H 19CDH + 00E0H = 1AADH
mov bx,[4] ; BX = 30F0H (答案不唯一) FFFF:4 = 30F0H
add bx,[6] ; BX = 6022H (答案不唯一) FFFF:6 = 2F32H 30F0H + 2F32H = 6022H
push ax ; SP = 00FEH 修改的内存单元的地址是 220FEH 内容为1AADH (答案不唯一)
push bx ; SP = 00FCH 修改的内存单元的地址是 220FCH 内容为 6022H (答案不唯一)
pop ax ; SP = 00FEH ax= 6022H
pop bx ; SP = 0100H bx= 1AADH
push [4] ; SP = 00FEH 修改的内存单元的地址是 220FEH 内容为 30F0H (答案不唯一)
push [6] ; SP = 00FCH 修改的内存单元的地址是 220FCH 内容为 2F32H (答案不唯一)
实验结果:
(2) 仔细观察图 3.19 中的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?
解答:
由图分析可知,CS、IP的内容在执行mov ss,ax 指令后入栈了。这是为什么呢?为什么在执行前一条指令执行后CS、IP的内容没有入栈?
注意,CS、IP入栈是在mov ss,ax 执行后才在栈段20000H显示出来。也就是说,CS、IP的内容在前一条指令 mov ax,2000 后 CS、IP 的内容其实也入栈了,只不过当时的栈段处于 SS = 1269H SP = FFEE 位置处,CS、IP的内容保存在了那里。在执行mov ss,ax后,栈段改为 SS = 2000H SP = 0010H 位置了。
那么剩下的 0BEEH 和 0020H又是什么?这一部分涉及到了单步中断,笔者一开始对这一部分也不是很了解,这一部分在后面王爽老师12.11 章节王爽老师作出了解答。解答如下:
基本上,CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程。单步中断的类型码为1,则它所引发的中断过程如下:
1) 取得中断类型码1;
2)标志寄存器入栈,TF、IF设置为0
3)CS、IP入栈
4)(IP)=(1*4), (CS)=(1*4+2)。
Debug的实现就是提供了单步中断的中断处理程序,功能为显示所有寄存器中的内容后等待输入命令。然后,在使用t命令执行指令时,Debug将TF设置为1,使得CPU工作于单步中断方式下,则在CPU执行完这些指令后就引发单步中断,执行单步中断的中断处理程序,所有寄存器中的内容被现实在屏幕上,并且等待输入命令。
CPU在进入中断处理程序之前,设置TF=0。这样是为了避免CPU在执行中断处理程序的时候发生单步中断。这就是为什么在中断过程中有TF=0这个步骤。
其实看不懂也没有关系,随着我们对中断的深入学习就会理解了。