实验1 用机器指令和汇编指令编程
实验1 用机器指令和汇编指令编程
一、实验目的
-
-
熟练掌握使用debug工具编写和调试x86汇编命令的方法
-
掌握8086CPU、寄存器、内存的基础知识
-
理解并掌握内存中多字节数据的存放:小端法
-
理解并掌握「栈」内存空间的特性和使用
-
掌握指令mov, add, sub, jmp, push, pop的基础用法
-
二、实验内容
1. 教材实验1(P35)
练习教材P35-45「预备知识:Debug的使用」,学习debug启动、退出及常用指令用法; 在练习基础上,完成「2. 实验任务」
2. 教材实验2(P71)
练习「1.预备知识:Debug 的使用」在练习基础上,完成「2. 实验任务」
为了便于验证实验结果,对「2. 实验任务」的(1)做如下两点调整:
① 在使用 a 命令输入指令调试之前,先使用 e 命令将内存单元 0022:0 ~0022:7连续 8 个字节数据修改为 50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H
② 将 P74 实验任务(1)中第1行的 mov ax, ffff → 改为 mov ax, 0022
实验前,请先从理论上分析指令执行后各个填空处的值,并记录下来。
实验时,通过在debug中调试,观察实验结果与理论分析是否一致;如果存在不一致的情形,尝试 发现问题所在,并分析原因。
四、实验结论
1. 教材实验1结论
实验任务(1)
将下面程序段写入内
机器码 汇编指令
b8 20 4e mov ax,4E20H
05 16 14 add ax,1416H
bb 00 20 mov bx,2000H
01 d8 add ax,bx
-
-
- 用e命令将程序写入内存,写完之后可以使用u命令查看汇编指令是否正确
-
d命令查看内存
-
-
- 用a命令将程序写入内存,可以直接以汇编语言的形式写入内存,可操作性强
-
用t命令进行单步调试,此时需要时CS:IP指向存储程序的内存起始地址
用a命令写入,并修改CS:IP指向2000:0
成功计算出2^8=256(0100H),主要是通过jmp实现循环进行累加。
实验任务(3)
生产日期为1992.01.01,接下来进行修改操作
进行修改操作,但是并没有修改成功,因为C0000~FFFFF是只读存储器(ROM)的地址,所以对其进行写入数据的操作是无效的。
实验任务(4)
向内存B8100H开始的单元中填写数据
当修改数据的地址不变,里面的数据变化时,图案的形状和颜色会有变化,图案的位置不变,当只改变地址,不改变里面的数据时,
图案的位置会发生辩护,形状和颜色不变。
A0000~BFFFF为显存地址空间,向该部分中写入的数据,会被显示卡输出到显示器上。
2. 教材实验2结论
实验任务(1)
① 截图记录:使用 e 命令修改 内存单元0022:0~0022:f 中的数据,及修改后查看是否正确写入的操作
② 截图记录:使用 a 命令输入的 p74 指令
③ 截图记录:每一行指令单步调试(如单步调试步骤多,可分屏截图,但不要有遗漏)
④ P74 中指令执行后各个寄存器填空结果,以在文档中手工标注或手机拍照截图方式复制在文档中。 对于③单步调试的观察,与理论上分析的结果进行比较,检验是否一致。如不一致,分析原因。
mov ax,[0] ax=5150
add ax,[2] ax=A4A2
mov bx,[4] bx=5554
add bx,[6] bx=ACAA
push ax sp=00FE; 修改的内存单元的地址是 2200:00FE, 内容为 A4A2
push bx sp=00FC; 修改的内存单元的地址是 2200:00FC, 内容为 ACAA
pop ax sp=00FE; ax=ACAA
pop bx sp=0100; bx=A4A2
push [4] sp=00FE; 修改的内存单元的地址是 2200:00FE, 内容为 5554
push [6] sp=00FC; 修改的内存单元的地址是 2200:00FC, 内容为 5756
经分析理论与实验结论一致
实验任务(2)
① 截图记录图 3.19 中使用 a命令输入的 7 行指令,使用 e 命令修改 2000:0~2000:f 的值, 及修改后查看的部分
② 单步调试每一行汇编指令的截图。每一条指令单步调试后,都使用 d 命令查看2000:0~2000:f 的值。观察每一条指令执行后相关寄存器值的变化,及 2000:0~2000:f 单元值的变化,并思考原因。
以文字方式陈述:
① 前3行汇编指令的功能,特别是,mov sp, 10意味着什么?初始时栈顶和栈底分别是?
mov ax,2000 将2000H传入ax寄存器
mov ss,ax 将2000H通过ax寄存器传入ss寄存器
mov sp,10 初试化栈顶,将栈顶偏移地址设置为0010H
初始时栈顶是 2000:0010H
栈底是2000:000EH
② 基于单步调试观察到的变化,给出你对此的思考及可能原因分析。
Debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。
在2000:0开始的地址中,中间过程存储了cs,ip,ax的值。