实验1 使用机器指令和汇编指令编程
一.实验目的
1.熟练掌握使用debug工具编写和调试x86汇编命令的方法
2.掌握8086CPU,寄存器,内存的基础知识
3.理解并掌握内存中多字节数据的存放:小端法
4.理解并掌握栈内存空间的特性和使用
5.掌握指令mov,add,sub,jmp,push,pop的基础用法
二.实验准备
1.复习教材1-2章内容,完成教材内相关检测点
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
练习教材P35-45「预备知识:Debug的使用」,学习debug启动、退出及常用指令用法; 在练习基础上,完成「2. 实验任务」
2.教材实验2
练习「1.预备知识:Debug 的使用」 在练习基础上,完成「2. 实验任务」
四. 教材实验1结论
-
实验任务(1)
使用Debug,将下面的程序写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化。
机器码数据较多,只用前4行实验即可。
用t命令和a命令两种方式,写入内存。用t命令单步调试。附上实验截图。


-
实验任务(2)
将下面3条指令写入从2000:0开始的内存单元中,利用值3条指令计算2的8次方
mov x,1
add ax,ax
jmp 2000:0003
附上a命令写入和t命令单步调试实验截图。对于单步调试较多的部分,只截调试开始,和调试出正确结果的部分即可。


继续使用T命令执行下去,0003单元中的指令共执行8次,0005单元中的指令执行7或者8次。共需执行16/17次T命令。
-
实验任务(3)
找出内存中的生产日期,尝试修改。


修改后好像数据并没有发生变化,地址C0000~FFFFF是各类ROM的地址空间,向地址C0000~FFFFF的内存单元中写入数据相等于改写只读存储器中的内容所以操作是无效的。
-
实验任务(4)
向内存从地址B8100H开始的单元中填写数据并观察产生的现象。

向地址A0000~BFFFF的内存单元中写入数据,就是向显存中写入数据,这些数据会被显卡输出到显示器上。
输入内容前面的表示形状,后面的表示颜色,一个形状对应一个颜色,前面内存地址的数值对应输出图形的具体位置,后面执行的指令会覆盖前面指令所进行的操作。
2. 教材实验2结论
-
实验任务(1)





mov ax,0022
mov ds,ax
mov ax,2000
mov ss,ax
mov sp,0100
mov ax,[0] ;ax=5150
add ax,[2] ;ax=A4A2
mov bx,[4] ;bx=5554
add bx,[6] ;bx=ACAA
push ax ;sp=00FE;修改的内存单元的地址是220FF:220FE内容为A4A2
push bx ;sp=00FC;修改的内存单元的地址是220FD:220FC内容为ACAA
pop ax ;sp=00FE;ax=ACAA
pop bx ;sp=0100;bx=A4A2
push [4] ;sp=00FE;修改的内存单元的地址是220FF:220FE内容为5554
push [6] ;sp=00FC;修改的内存单元的地址是220FD:220FC内容为5756
-
实验任务(2)


前3行汇编指令的功能:
mov ax,2000 //将数值2000放入ax中
mov ss,ax //设置栈的段地址,通过ax中转数据
mov sp,10 //设置栈顶的偏移地址
//栈底20000 栈顶20010
两条指令执行后靠近栈顶的10个字节中值立即有了变化,是对定义栈段时部分运行环境变量进行暂存,靠近栈顶的10个字节中的暂存数据分别是SS、IP、 CS 等的值。
因为在用T指令在进行调试时,会产生中断。而为了保护现场,CPU先把标志寄存器入栈,再把CS IP分别入栈。


浙公网安备 33010602011771号