汇编语言实验一
汇编语言程序设计实验一
实验目的
- 熟练掌握使用debug工具编写和调试x86汇编命令的方法
- 掌握8086CPU、寄存器、内存的基础知识
- 理解并掌握内存中多字节数据的存放:小端法
- 理解并掌握「栈」内存空间的特性和使用
- 掌握指令mov, add, sub, jmp, push, pop的基础用法
实验准备
- 复习教材第1~2章内容,完成教材内相关检测点
- 复习教材第3章「栈」的知识:栈的特性、寄存器 SS 和 SP、指令 push 和 pop ,完成教材 3.6~3.9 节内的问题 3.6~3.12,检测点 3.1~3.2 3. 结合教材实验1(P35)和课程QQ群文件中的文档,学习debug工具用法。
实验内容
教材实验1
(1).把如下的程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化。
| 机器码 | 汇编指令 |
|---|---|
| b8 20 4e | mov ax,4E20H |
| 05 16 14 | add ax,1416H |
| bb 00 20 | mov bx,200H |
| 01 d8 | add ax,bx |
使用a命令将指令写入内存;
使用t执行命令,注意观察CS:IP的指向变化:

使用e命令以机器码的形式将指令写入内存中:
使用t执行命令,注意观察CS:IP的指向变化:

使用u进行反汇编,与输入的机器码进行对比:

(2).使用一下 3 条指令写入从 2000:0 开始的内存单元中,利用这 3 条指令计算 2 的 8 次方
mov ax,1
add ax,ax
jmp 2000:0003
使用a指令将汇编指令写入内存,调整cs和ip寄存器的内容:

t指令单步调试得到结果:ax=0100,即为$2^8$

分析:
指令的第一步是将ax赋初值为1,第二步是ax+=ax,即ax变为原先的二倍,最后执行第三步的跳转指令再次将ax变为原先的2倍,所以执行一轮就相当于乘以2,所以单步调试16次就得到结果AX=0100;
(3).PC机主板上的ROM中写着一个生产日期,在内存 FFF00H~FFFFFH 的某几个单元中,找到这个生产日期并试图改变它;
首先使用d命令进行查看:
从下图可以看出日期存在于FFFF5H-FFFFFH之间:

对该区域使用-e命令进行更改发现无效

原因:ROM是只读存储器,不可能修改内存中的值;
(4).向内存从B8100H开始的单元中填写数据,如:
-e B8100:0000 01 01 02 02 03 03 04 04
通过写入不同的数据,返现屏幕中会出现不同数量的表情符号;


这是因为8000H-9FFFH是显存地址空间,在其中写入不同的数据也会相应的显示出不同的图案结果;
教材实验二
(1).使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。
mov ax,0022
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax, [0]
add ax, [2]
mov bx, [4]
add bx, [6]
push ax
push bx
pop ax
pop bx
push [4]
push [6]
在使用a命令输入指令调试之前,先使用e命令将内存单元0022:0-0022:7连续8个字节数据修改为50H,51H,52H,53H,54H,55H,56H,57H
使用e命令修改数据:

将程序段写入内存:

逐条执行,分析结果:



实验结果与预期结果相同,下面是具体的结果和分析:
| 汇编指令 | 结果数据 | 分析 |
|---|---|---|
| mov ax,0022 | 0022 | ax赋值为0022 |
| mov ds,ax | 0022 | 内存单元段地址设置为ax |
| mov ax,2200 | 2200 | ax赋值为2200 |
| mov ss,ax | 2200 | 栈顶指针赋值为2200 |
| mov sp,0100 | 0100 | 栈顶的偏移地址为0100 |
| mov ax,[0] | ax=5150 | 2200:0处的两个字节 |
| add ax,[2] | ax=5352+5150=A4A2 | ax+5352 |
| mov bx,[4] | bx=5554 | 2200:4处的两个字节 |
| add bx,[6] | bx=5554+5756=ACAA | bx+5756 |
| push ax | sp=0100-2=00FE 存入A4A2 | 栈顶上移2字节 |
| push bx | sp=00FE-2=00FC 存入ACAA | 栈顶上移2字节 |
| pop ax | sp=00FE;ax=ACAA | 栈顶下移2字节 |
| pop bx | sp=0100;bx=A4A2 | 栈顶下移2字节 |
| push[6] | sp=00FC;存入5756 | 栈顶上移2字节 |
(2).观察3.19中的实验过程,然后分析:为什么2000:0-2000:f中的内容会发生改变;
输入指令单步调试


通过实验发现mov ss,ax和mov sp,10一同被执行,
(学完中断之后补的)此外我们可以看到当使用t命令执行到mov ss,ax的时候栈中就存在了本不应该存在的数据:01A3,073F,0108,2000,其中01A3不知道是什么但是后面三个分别是cs,ip,ss,因为t是单步中断指令,因此我们推测,就像是多个循环使用栈来保存和恢复cx一样,这里cpu会自动保护现场,将cs,ip,ss存入栈中,以便恢复现场。
实验总结
- 本次实验是我熟悉了debug的各项命令以及应用场景,可以初步使用debug工具来对问题进行分析与实验;
- 通过本次实验将计算机组成原理的相关知识迁移过来,例如:ROM是只读存储器,不能进行修改;更好的理解了大端、小端存储的相关概念,以及基地址、偏移量的具体使用;
- 对于栈这一数据结构在汇编使用的场景与形式有了更为直观的理解,了解到了书写程序时爆栈等异常的出现原因

浙公网安备 33010602011771号