1. 预备知识:Debug的使用
(1)关于D命令
之前的实验中,我们知道D命令是用来查看内存单元的命令:d 段地址:偏移地址。
我们又知道段地址是存放在寄存器中的,在D命令后直接给出段地址,debug在执行D命令时,会将段地址送入段寄存器中。因此D命令也提供了这样的一种方式:d 段寄存器:偏移地址:
-r ds
:1000
-d ds:0 //查看从1000:0开始的内存区间中的内容
-r ds
:1000
-d ds:10 18 //查看1000:10~1000:18中的内容
-d cs:0 //查看当前代码段中的指令代码
-d ss:0 //查看当前栈段中的内容
(2)在E、A、U命令中使用段寄存器
-r ds
:1000
-d ds:0 //查看从1000:0开始的内存区间中的内容
-r ds
:1000
-d ds:10 18 //查看1000:10~1000:18中的内容
-d cs:0 //查看当前代码段中的指令代码
-d ss:0 //查看当前栈段中的内容
(3)下一条指令执行了吗?
如图所示:
- 执行完第一个T命令后,ax=2000,ss=073F,sp=00FD
- 执行完第二个T命令后,ax=2000,ss=2000,sp=0010
注意到这里的SP变了,但是应该是在执行第三次T命令后,SP的值才会改变。也就说,执行完第二个T命令后,MOV SP,0010命令紧接着就被运行了。
这主要是因为中断机制,这是后面章节的重要内容,这里并不展开。现在只要记住:T命令在执行修改栈段寄存器SS的指令时,下一条命令也紧接着被执行。
实验任务
(1)
写入以下命令:
逐条执行后,根据实际情况填写(红色字体为所填内容):
开始执行:
- 起始各寄存器的状态:
mov ax,[0]ax=C0EAadd ax,[2]ax=C0FCmov bx,[4]bx=30F0add bx,[6]bx=6021push axsp=00FE,修改的内存单元(两个内存单元,称为字单元。下同)的地址是:2200:00FE,内容是:C0FCpush bxsp=00FC,修改的内存单元的地址是:2200:00FC,内容是:6021pop axsp=00FE ax=6021pop bxsp=0100 bx=C0FCpush [4]sp=00FE,修改的内存单元的地址是:2200:00FE,内容是:30F0push [6]sp=00FC,修改的内存单元的地址是:2200:00FC,内容是:2F31
(2)为什么2000:0~2000:f中的内容会发生改变?
输出结果显示,靠近栈顶的几个字单元存储了
CS:IP的值。
==猜测==: 定义栈段时,对运行环境进行了暂存。