实验一 查看CPU和内存,使用机器语言和汇编语言进行编程
1.预备知识:Debug的使用
Debug是DOS、Windows提供的实模式(8086方式)程序的调试工具。使用它,可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。是汇编程序设计中常用的调试工具。在Debug环境下,可以调试经汇编、连接后生成的可执行程序,编写简单的程序。
在32位操作系统下debug的启动与退出:
启动:
方法一:单击“开始”→“运行”(或使用快捷键Windows+R),输入cmd,确定,进入dos界面,输入debug,回车,进入debug调试环境,以短线“—”为命令提示符。
方法二:单击“开始”→“运行”(或使用快捷键Windows+R),输入debug,确定,即进入debug调试环境,以短线“—”为命令提示符。
退出:
使用q命令,回车即可。
Debug命令格式和参数:
在debug中的命令大小写等价;
Debug中数字默认为十六进制表示,不需要加H;
在debug中输入命令后,按下回车键执行;按下ctrl+c则终止命令的执行;
在debug中命令和参数之间可以没有分隔符(如空格)。
在64位操作系统下使用debug:
Debug不能在64位操作系统下运行,因此需要下载debug与32位DOS模拟器(在此使用DOSBOX)。
DOSBOX下载:https://www.dosbox.com/download.php?main=1
安装下载Debug.exe
环境配置:找到DOSBox安装目录下的DOSBox 0.74 Options.bat文件,然后双击:
进入文本,在末尾添加如图示:
在此环境已配置好了。
2. 常用debug功能
l 用r命令查看、改变CPU寄存器的内容:
—R<回车>
显示所有寄存器的值
—R AX<回车>
显示当前AX所谓值为0000,若要修改,则在冒号后输入要修改的值,如输入1234,回车再用—R AX查看,可见AX值已修改。如若不修改,则两次回车即可。
l D命令查看内存中的内容:
—D<回车>
D命令直接查看,列出预设地址处128位个字节内容
—D 地址
—D 1001
显示从当前地址开始之后128个字节内容
—D 地址范围
—D 1001 1008
两种方式显示指定范围内存储单元的内容,如上图
l E命令改写内存中内容;
—E 地址 数据 数据·····(或字符)
—E 1001 0 1 2 3 4 5 6 7
用E命令修改从1001开始的8个单元的内容,用D查看内容变化
也可以用提问方式逐个修改:
a. 输入E 1001,按enter键;
b. Debug显示起始地址,和起始单元内容,光标停在”.”后提示想要写入数据,输入数据按空格,用输入数据修改当前内存单元;或不输入数据直接按空格,即不对当前单元进行修改;
c. 当前单元处理完成后,接着显示下一单元的内容,并提示净宗修改,同样方法进行处理;
d. 当所有希望改写的内存单元改写完后,按enter键,E命令操作结束。
也可用E命令向内存中写入字符串。
l 用U命令将内存中的机器指令翻译成汇编指令
用E命令向内存中写入机器码,D命令查看写入的机器码用U命令可以查看每一条机器指令的地址、机器指令,并将内存单元中的内容翻译为汇编指令并显示出来。
l 用T命令执行一条机器指令
用E命令向从1000:0开始的内存单元中写入8个字节的机器码;R命令查看CPU中寄存器的状态,CS=073F,IP=0100,指向内存073F:0100;用R命令修改CS、IP中的内容,使CS:IP指向1000:0。然后就可以用T命令来执行我们写入的指令,执行后,AX中的内容变为1,IP变为IP+3。
l 用A命令以汇编指令的格式在内存中写入一条机器指令
—A 起始地址,以汇编语言向从1000:0开始的内存单元中写入了几条指令,然后用D命令查看A命令的执行结果
—A 回车,从预设的地址开始输入,想要结束A命令,则不输入汇编指令,直接按enter键即结束A命令
—?<回车>
显示常用命令集,可帮助快速找到所需命令。
2. 实验任务
(1)使用debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化。
提示:用E命令和A命令以两种方式将指令写入内存,T命令执行时注意CS:IP的指向。
用E命令从1000:0处开始写入机器码,因为有长度限制,我只写到第八条bb 26 00这一条,输入R命令查看CPU内容,并修改CS:IP使其指向1000:0。然后使用T命令逐条执行机器码如下:
同样方法从1000:0012处开始写从bb 26 00以下的机器码,CS:IP指向1000:0012
用A命令以汇编指令方式写入内存,打开DOSBOX,输入debug进入调试模式,使用R命令修改CS:IP的内容使其指向1000:0,先用D命令查看从1000:0开始的单元内容,然后用A命令从1000:0处开始逐条写入汇编指令,再次用D命令查看汇编指令执行后单元里面的内容。
(2)将下面三条指令写入从2000:0开始的单元中,利用这三条指令计算2的八次方。
MOV AX,1
ADD AX,AX
JMP 2000:0003
一直逐条执行T命令,直到AX=0100,因为debug程序中数字默认16进制,100H=256=2^8
计算所需执行指令条数 (3+2*7=17=11H),也可直接输入: —T=0 11
(3)查看内存中的内容。PC机主板上的ROM中写有一个期,在内存FFF00H~FFFFFH的某几个单元,请找到并试图修改它。
可以看见E命令并未修改成功。
这是因为Rom(Read Only Memory)只读存储器,这种存储器(Memory)的内容任何情况下都不会改变,计算机与用户只能读取保存在这里的指令,和使用存储在ROM的数据,但不能变更或存入数据。
(3)向从内存单元B8100H开始的单元中填写数据,如:
—E B810:0000 01 01 02 02 03 03 04 04
修改数据后:
修改地址后:
实验发现每两个字节表示一个字符,其中前一字节控制字符种类,后一字节控制颜色。偏移地址与字符在终端中显示的位置有关。
实验总结:
通过这次实验,我对汇编debug的常用功能有了基本了解,对汇编语言这门课程有了更深层次的认识。知道了debug的调试环境以及配置问题,了解了汇编程序的简单编写,知道了机器指令与汇编指令编程的方式。