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=C0EA
add ax,[2]
ax=C0FC
mov bx,[4]
bx=30F0
5. add bx,[6]
bx=6021
6. push ax
sp=00FE,修改的内存单元(两个内存单元,称为字单元。下同)的地址是:2200:00FE,内容是:C0FC
7. push bx
sp=00FC,修改的内存单元的地址是:2200:00FC,内容是:6021
8. pop ax
sp=00FE ax=6021
9. pop bx
sp=0100 bx=C0FC
10. push [4]
sp=00FE,修改的内存单元的地址是:2200:00FE,内容是:30F0
11. push [6]
sp=00FC,修改的内存单元的地址是:2200:00FC,内容是:2F31
(2)为什么2000:0~2000:f中的内容会发生改变?
输出结果显示,靠近栈顶的几个字单元存储了CS:IP
的值。
猜测: 定义栈段时,对运行环境进行了暂存。