实验二
题目预览
- 使用Debug,将下面的程序段写入程序,逐条进行,根据指令执行后的实际运行情况填空。
- 仔细观察图3.19中的实验过程,然后分析:为什么2000:0~2000:F中的内容会发生改变?
1
使用Debug,将下面的程序段写入程序,逐条进行,根据指令执行后的实际运行情况填空。
mov ax,ffff
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax,[0] ;ax=____
add ax,[2] ;ax=____
mov bx,[4] ;bx=____
add bx,[6] ;bx=____
push ax ;sp=__ ; 修改的内存单元的地址是____内容为____
push bx ;sp=____ ; 修改的内存单元的地址是____内容为____
pop ax ;sp=____ ; ax=____
pop bx ;sp=____ ; bx=____
push [4] ;sp=____ ; 修改的内存单元的地址是____内容为____
push [6] ;sp=____ ; 修改的内存单元的地址是____内容为____
在debug模式下用A命令写入程序
运行
下面运行了要填空的阶段了
2
仔细观察图3.19中的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?
可以发现初始没有执行这段代码时,我们使用d命令观察2000:00内存,都是00,怎么创建栈结构指向这段内存时,我们发现有些数据了。这些数据是什么?
可以看出这里面有cs值、ip值、ax值(这个容易看出来),"9D 05"是标志寄存器flag的值。
后面在将内中断的时候,就明白了。t命令实际是引发了单步中断,执行中断例程时,CPU会将一些中断例程使用的的寄存器变量自动压栈到栈中,此例中就包括了上述的寄存器变量的值。
单步中断P249
我们在使用Debug的t命令的时候,没有用想过这样的问题,Debug如何能让CPU在执行一条指令后,就显示各个寄存器的状态?我们知道,CPU在执行程序的时候是从CS:IP指向的某个地址的开始,自动向下读取指令执行。也就是说,如果CPU不提供其他功能的话, 就按这种方式工作,只要CPU一加电,它就从预设的地址开始一直执行下去,不可能有任何程序能控制它在执行完一条指令后停止,去做别的事情。可是,我们在Debug中看到的情况却是,Debug可以控制CPU执行被加载程序中的一条指令,然后让它停下来,显示寄存器的状态。
Debug有特殊的能力吗?我们只能说Debug利用了CPU提供的一种功能。只有CPU提供了在执行一条指令后就转去做其他事情的功能,Debug或是其他的程序才能利用CPU提供的这种功能做出我们使用T命令时的效果。
主要看(2)(4)(5)
中断过程P238
8086CPU在收到中断信息后,所引发的中断过程。
(1)(从中断信息中)取得中断类型码;
(2)标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值,所以先将其保存在栈中);
(3)设置标志寄存器的第8位TF和第9位IF的值为0(这一步的目的后面将介绍);
(4)CS的内容入栈;
(5)IP的内容入栈;
(6)从内存地址为中断类型码4和中断类型码4+2的两个字单元中读取中断处理程序的入口地址设置IP和CS。