汇编语言(王爽)实验一
实验一
一、Debug的使用
1.1 什么是Debug
用来查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行的工具。
1.2 用到的Debug功能
· 用R命令查看、改变CPU寄存器的内容
· 用D命令查看内存中的内容
· 用E命令改写内存中的内容
· 用U命令将内存中的机器指令翻译成汇编指令
· 用T命令执行一条机器指令
· 用A命令以汇编指令的格式在内存中写入一条机器指令
1.3 win10中进入Debug
打开dosbox,在命令行中输入debug
1.4 用R命令查看、改变CPU寄存器的内容
现已知道了AX、BX、CX、DX、CS、IP这6个寄存器,其他寄存器先不予理会
输入 r
注意CS和IP的值,CS=0740,IP=0100,也就是说内存0740:0100处的指令为CPU当前要读取、执行的指令,在最下方还列出了CS:IP所指向的内存单元处存放的机器码并将其翻译为汇编指令
输入 r 寄存器名 修改寄存器中的内容
再次输入 r 可查看修改后的结构
1.5 用D命令查看内存中的内容
D命令格式较多,只介绍部分,使用 d 段地址:偏移地址 的格式来查看,Debug将列出从指定内存单元开始的128个内存单元的内容,在输入 d 1000:0后 Debug列出1000:0~1000:7F中的内容
若输入 d 1000:9 输出如图,从1000:9开始显示,一直到1000:88,用16进制的格式输出,每行的输出从16的整数倍的地址开始,最多输出16个单元的内容,中间的 “-”左右各8各单元,便于查看,最右边显示每个内存单元数据对应可显示的ASCII码,若没有对应的ASCII码,用“.”代替
在使用了 d 段地址:偏移地址 之后,接着使用 d,可列出后续的内容,格式相同
在一进入Debug后,用 d 直接查看,将列出Debug预设地址处的内容
也可以指定D命令查看的范围,采用 d 段地址:起始偏移地址 结尾偏移地址 的格式,比如要看1000:0~1000:9中的内容,可以用 d 1000:0 9 实现
如果想查看内存单元10000H中的内容,可以有很多种方法,因为图中的所有 段地址:偏移地址 都表示了10000H这一物理地址
1.6 用E命令改写内存中的内容
可以用 e 起始地址 数据 数据 数据 …… 的格式来进行,如将内存1000:0~1000:9单元中的内容写为0、1、2、3、4、5……
这些数据也可以是字符
或者是字符串
也可以逐个地修改,如输入 e 1000:10 回车,此时会显示起始地址的原始内容,我们在“.”之后输入新的值,按空格对下一个地址的值进行修改,若不想修改,则按空格到下一个地址,改写完毕后按回车退出
1.7 用E命令写入机器码,U命令查看机器码的含义,T命令执行机器码
机器码也是数据,可以用同样的方法将机器码对应的二进制数写入内存,比如我们在内存1000:0单元写入一段数据
mov ax,0001 b80100
mov cx,0002 b90200
add ax,cx 01c8
使用U命令将从1000:0开始的内存单元中的内容翻译为汇编指令,并显示出来
可以使用T命令执行一条或多条指令
先用R命令查看CPU中寄存器的状态
观察到CS:IP还未指向要求的内存单元,所以用R命令修改CS、IP中的内容,使CS:IP指向1000:0
接下来使用T命令,执行T命令后,CPU执行CS:IP指向的指令,指令执行后,Debug显示CPU中寄存器的状态,在不断使用T命令的过程中,我们要注意AX,CX,IP值的变化
1.8 用A命令以汇编指令的形式在内存中写入机器指令
此前用E命令写入机器指令很不方便,最好能直接以汇编指令的形式写入,这就用到了A命令,如图为从1000:0开始的内存单元写入指令,a 1000:0
在给出的地址上写入汇编指令后回车,继续写汇编指令,在给出地址后直接按回车表示操作结束
也可以简单地使用A命令, a 即不指定初始地址,从一个预设的地址开始输入指令
二、实验
**2.1 **使用E命令和A命令两种方式将如下指令写入内存,逐条执行并观察CPU中相关寄存器的变化(注意在写汇编指令时不要加上H)
机器码 汇编指令
b8 20 4e mov ax,4E20
05 16 14 add ax,1416
bb 00 20 mov bx,2000
01 d8 add ax,bx
89 c3 mov bx,ax
01 d8 add ax,bx
b8 1a 00 mov ax,001A
bb 26 00 mov bx,0026
00 d8 add al,bl
00 dc add ah,bl
00 c7 add bh,al
b4 00 mov ah,0
00 d8 add al,bl
04 9c add al,9C
2.2 将下面3条指令写入2000:0开始的内存单元中,利用这3条指令计算2的8次方
mov ax,1
add ax,ax
jmp 2000:0003
答:循环8次,结果为100H(16的平方)
2.3 PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到生产日期并试图改变它
答:不能修改,因为ROM为只读存储器,无法修改
2.4 向内存从B8100H开始的单元中填写数据 如:
e B810:0000 01 01 02 02 03 03 04 04
可以尝试填写不同的数据或不同的地址
答:
回车后屏幕显示该图案,因为A0000~BFFFF为显存地址空间,在该段地址中输入数据后会在显示器上输出相应的内容。
具体8086PC机内存地址空间的分配情况可以看第一章1.15节
上一篇: 汇编语言(王爽)实验十七
下一篇: 5.Go语言基本类型 —— 浮点型