实验一查看CPU和内存,用机器指令和汇编指令编程
- 实验目的:
- 了解什么是Debug以及Dosbox。
- 学习dosbox及dubug的基本用法
- 学会在dubug中使用汇编指令编写简单程序
- 实验准备
- 复习第二章关于通用寄存器以及CS和IP的相关内容。
- 复习第二章8086给出物理地址的方法。
- 提前阅读和了解CPU的实模式、保护模式和虚拟模式三种工作模式的资料。
- 实验内容及步骤
(一)预备知识:Debug的使用
1.什么是Debug?
Debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具。使用它,可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。
*关于详细介绍请大家自行查阅资料。
2.我们用到的Debug功能
R命令:查看和改变CPU寄存器的内容
D命令:查看内存中的内容
E:改写内存中的内容
U:将内存中的机器指令翻译成汇编指令
T命令:执行一条机器指令
A:以汇编指令的格式在内存中写入机器指令
3.进入Debug
Debug是在DOS方式下使用的程序。我们进入debug前,应先进入DOS方式。
- 重新启动计算机,进入DOS方式,此时进入的是实模式DOS。
- 在Windows中进入DOS方式,此时进入的是虚拟8086模式的DOS。
*在64位的Windows中进入Debug,的方法如下:
①下载一个叫做Dosbox的软件,将其安装在D盘上的新建目录Dosbox下;
②运行Dosbox,使用mount命令将此目录挂载为为C盘:mount c d:\dosbox
- 转至C盘:c:
- 转至虚拟C盘下的MASM(因为debug.exe存放在d:\dosbox\masm中):
cd c:\masm
- 运行debug:debug
4.用R命令查看和改变CPU的内容
观察AX、BX、CX、DX、CS和IP的值,尤其注意CS和IP的值及其含义
修改寄存器的值,比如:r ax,在使用R命令查看一下修改的结果。
也可以使用R命令修改CS和IP的值。
5.D命令查看内存中的内容
格式:D 段地址:偏移地址,列出从指定内存单元开始的128个内存单元的内容。也可以使用“D 段地址:起始偏移地址 结尾偏移地址”来指定查看的范围。
以下分成三部分内容:
中间是从指定地址开始的128个内存单元的内容
左边是每行的起始地址
右边是每个内存单元中的数据对应的可显示的ASCII码字符。
6.E命令改写内存单元的内容
E命令以提问的方式来逐个地址地修改从某一地址开始的内存单元中的内容,一个单元修改完毕之后,按下空格键,即用输入的数据改写了当前的内存单元,全部修改完毕之后,按Enter键结束E命令。
7.用E命令向内存中写入机器码,用U命令查看内存中机器码的含义,用T命令执行内存中的机器码。
比如,我们要从内存1000:0单元开始写入这样一段机器码:
机器码 对应的汇编指令
B80100 mov ax,0001
B90200 mov cx,0002
01c8 add ax,cx
E 段地址:偏移地址 数值1 数值2 数值3 ……
U 段地址:偏移地址,U命令的显示输出分成了三部分:每一条机器指令的地址、机器指令、机器指令所对应的汇编指令。
T命令可以执行一条或者多条指令。简单地使用T命令,可以执行CS:IP指向的指令。
我们使用T命令来执行我们刚才写入的指令,此时我们应该让CS:IP指向1000:0处。使用R修改CS和IP的值,让CS=1000,IP=0,然后使用R命令查看当前各个寄存器的值,再使用T命令单步跟踪执行,观察各个寄存器的变化
8.用A命令以汇编指令的形式在内存中写入机器指令
可以看到,当我们使用A命令写入指令时,我们输入的是汇编指令,Debug将这些汇编指令翻译为对应的机器指令,将它们的机器码写入了内存。
9.退出Debug:Q命令
(二)自主实验任务:
1.使用Debug,将下面的程序段写入内容,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化。
2.将下面3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。
Mov ax.1
Add ax,ax
Jmp 2000:0003
查看内存中的内容。
3.PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它。如果对实验的结果感到疑惑,请复习第一章1.15节的内容。
4.向内存从B81100H开始的单元中填写数据,如:
-E B810:0000 01 01 02 02 03 03 04 04