实验一 查看CPU和内存,使用机器语言和汇编语言进行编程

实验一  查看CPU和内存,使用机器语言和汇编语言进行编程

.预备知识:Debug的使用

   DebugDOSWindows提供的实模式(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位操作系统下运行,因此需要下载debug32DOS模拟器(在此使用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命令向内存中写入字符串。

U命令将内存中的机器指令翻译成汇编指令

E命令向内存中写入机器码,D命令查看写入的机器码用U命令可以查看每一条机器指令的地址、机器指令,并将内存单元中的内容翻译为汇编指令并显示出来。

T命令执行一条机器指令

E命令向从10000开始的内存单元中写入8个字节的机器码;R命令查看CPU中寄存器的状态,CS=073FIP=0100,指向内存073F0100;用R命令修改CSIP中的内容,使CSIP指向10000。然后就可以用T命令来执行我们写入的指令,执行后,AX中的内容变为1,IP变为IP+3。

A命令以汇编指令的格式在内存中写入一条机器指令

A 起始地址,以汇编语言向从1000:0开始的内存单元中写入了几条指令,然后用D命令查看A命令的执行结果

A 回车,从预设的地址开始输入,想要结束A命令,则不输入汇编指令,直接按enter键即结束A命令

—?<回车>

显示常用命令集,可帮助快速找到所需命令。

2. 实验任务

(1)使用debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化。

提示:用E命令和A命令以两种方式将指令写入内存,T命令执行时注意CS:IP的指向。

 E命令从10000处开始写入机器码,因为有长度限制,我只写到第八条bb 26 00这一条,输入R命令查看CPU内容,并修改CSIP使其指向10000。然后使用T命令逐条执行机器码如下:

同样方法从10000012处开始写从bb 26 00以下的机器码,CSIP指向10000012

A命令以汇编指令方式写入内存,打开DOSBOX,输入debug进入调试模式,使用R命令修改CSIP的内容使其指向10000,先用D命令查看从10000开始的单元内容,然后用A命令从10000处开始逐条写入汇编指令,再次用D命令查看汇编指令执行后单元里面的内容。

(2)将下面三条指令写入从20000开始的单元中,利用这三条指令计算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命令并未修改成功。

这是因为RomRead Only Memory)只读存储器,这种存储器(Memory)的内容任何情况下都不会改变,计算机与用户只能读取保存在这里的指令,和使用存储在ROM的数据,但不能变更或存入数据。

(3)向从内存单元B8100H开始的单元中填写数据,如:

E B8100000 01 01 02 02 03 03 04 04

修改数据后:

修改地址后:

实验发现每两个字节表示一个字符,其中前一字节控制字符种类,后一字节控制颜色。偏移地址与字符在终端中显示的位置有关。

实验总结:

通过这次实验,我对汇编debug的常用功能有了基本了解,对汇编语言这门课程有了更深层次的认识。知道了debug的调试环境以及配置问题,了解了汇编程序的简单编写,知道了机器指令与汇编指令编程的方式。

猜你喜欢

转载自www.cnblogs.com/ljzww/p/9860873.html
今日推荐