实验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)

写入以下命令:

逐条执行后,根据实际情况填写(红色字体为所填内容):
开始执行:

  1. 起始各寄存器的状态:
  2. mov ax,[0] ax=C0EA
  3. add ax,[2] ax=C0FC
  4. 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的值。
猜测: 定义栈段时,对运行环境进行了暂存。

posted @ 2022-11-05 11:38  Mer_curiail  阅读(94)  评论(0)    收藏  举报  来源