实验任务一:使用debug将下面的程序写入内存,逐条执行,根据指令执行后的实际运行情况填空。
前提说明:为便于验证实验结果,对实验任务一做了2点调整:
①在使用a命令输入指令调试前,使用e命令将内存单元0021:0~0021:7连续8个字节数据修改为30H,31H,32H,33H,34H,35H,36H,37H。如下:
②将程序段的第一行 mov ax,ffff修改为 mov ax,0021。如下:
接下来,逐条执行语句,观察各寄存器的变化。
根据实验结果,得到:
实验结果与预期基本一致,不过发现了一个奇怪的现象,在单步调试的过程中,mov ss,ax的下一步本应是mov sp,0100,但在实际操作时发现,下一步变成了mov ax,[0],而mov sp,0100被自动执行了。通过查阅资料得知,这与CPU的中断机制有关,目前只需要知道debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。
实验任务二:输入如下七行代码,分析2000:0~2000:f中的内容为什么会改变。
用a命令输入上述代码,并用e命令修改和查看2000:0~2000:f的内容:
单步调试,并且每步调试后都用d命令查看2000:0~2000:f的值:
从中可以发现,前3行的作用是把2000:0~2000:f这段空间当作栈段,初始栈底为2000:f,初始栈顶为2000:10。一个奇怪的现象是,在2000:0~2000:f被初始化为0后,后面除了入栈操作对这段空间有修改外,其他的一些操作也对这段空间的内容作了修改,为什么会这样呢?注意观察发现,那些除入栈操作对空间的修改并不是随意的,而是把某些寄存器如cs,ip,ax的值存入了栈空间。这其中的原因与内中断有关,t命令实际是引发了单步中断,执行中断例程时,CPU会将一些中断例程使用的的寄存器变量自动压栈到栈中,此例中就包括了上述的寄存器变量的值。