实验2 用机器指令和汇编指令编程
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的值。
猜测: 定义栈段时,对运行环境进行了暂存。




浙公网安备 33010602011771号