微机原理与嵌入式系统实验6代码.docx
《微机原理与嵌入式系统实验6代码.docx》由会员分享,可在线阅读,更多相关《微机原理与嵌入式系统实验6代码.docx(27页珍藏版)》请在冰豆网上搜索。
微机原理与嵌入式系统实验6代码
微机原理与嵌入式系统实验指导书
北京联合大学信息学院
2014.4
实验一DOS环境下的汇编语言编程环境使用(基础与验证型)
一、实验要求和目的
1、掌握汇编语言程序设计的基本方法和技能;
2、熟练掌握使用全屏幕编辑程序EDIT编辑汇编语言源程序;
3、熟练掌握宏汇编程序MASM的使用;
4、熟练掌握连接程序LINK的使用。
二、软硬件环境
1、硬件环境:
微机CPU486以上,500MB以上硬盘,32M以上内存;
2、软件环境:
装有MASM6.0、DEBUG、LINK、EDIT等应用程序。
三、实验涉及的主要知识单元
1、汇编语言源程序的汇编过程
汇编语言源程序的汇编过程是是利用汇编程序(MASM)对已编辑好的源程序文件(.ASM)进行汇编,将源程序文件中以ASCII码表示的助记符指令逐条翻译成机器码指令,并完成源程序中的伪指令所指出的各种操作,最后可以建立3个文件:
扩展名为.OBJ的目标文件、扩展名为.LST的列表文件和扩展名为.CRF的交叉索引文件。
目标文件是必须建立的,它包含了程序中所有的机器码指令和伪指令指出的各种有关信息,但该文件中的操作数地址还不是内存的绝对地址,只是一个可浮动的相对地址。
列表文件(.LST)中包含了源程序的全部信息(包括注释)和汇编后的目标程序,列表文件可以打印输出,可供调试检查用。
交叉索引文件(.CRF)是用来了解源程序中各符号的定义和引用情况的。
.LST和.CRF两个文件不是必须建立的,可有有无,可以通过汇编时的命令加以选择。
在对源程序文件(ASM文件)汇编时,汇编程序将对ASM文件进行两遍扫描,若程序文件中有语法错误,则结束汇编,汇编程序将指出源程序中存在的错误,这时应返回编辑环境修改源程序中的错误,再经过汇编,直到最后得到无错误的目标程序,即OBJ文件。
因此,汇编程序的主要功能可以概括为以下三点:
(1)检查源程序中的语法错误,并给出错误信息;
(2)产生目标程序文件(OBJ文件),并可给出列表文件(.LST文件);(3)展开宏指令。
汇编程序是系统提供的用于汇编的系统软件,目前常用的汇编程序有Microsoft公司推出的宏汇编程MASM(MACROASSEMBLER)和BORLAND公司推出的TASM(TURBOASSEMBLER)两种。
Microsoft公司推出有宏汇编程序MASM和小汇编程序ASM两种,二者的区别在于:
MASM有宏处理功能,而ASM没有宏处理功能,因此,MASM比ASM的功能强大,但MASM需要占据较大的内存空间,当内存空间较小时(如64KB),只能使用ASM。
2、目标程序的连接过程
汇编后产生的目标程序(OBJ文件)并不是可执行程序文件(EXE文件),还不能直接运行,它必须通过连接程序(LINK)连接成一个可执行程序后才能运行。
连接程序进行连接时,其输入有两个部分:
一是目标文件(.OBJ),目标文件可以是一个也可以是多个,可以是汇编语言经汇编后产生的目标文件,也可以是高级语言(例如C语言)经编译后产生的目标文件;另一是库文件(.LIB),库文件是系统中已经建立的,主要是为高级语言提供的。
连接后输出两个文件,一是扩展名为.EXE的可执行文件,另一个是扩展名为.MAP的内存分配文件,它是连接程序的列表文件,又称为连接映像(LinkMap),它给出每个段在存储器中的分配情况,该文件可有可无。
连接程序给出的“无堆栈段的警告性错误”并不影响程序的运行。
所以,到此为止,连接过程已经结束,可以在操作系统下执行该.EXE程序了。
四、实验内容与步骤
1、实验内容
编写程序,在屏幕上显示“HelloWorld!
”,该源程序取名为hello.asm。
2、实验步骤
汇编语言程序设计上机过程如图1.1所示。
图1.1汇编语言程序上机过程
(一)用编辑程序EDIT建立汇编语言源程序文件(ASM文件)
在Windows2000或者在WindowsXP环境下鼠标单击“开始”→“运行”,在“运行”中输入“CMD”进入DOS模式,运行EDIT软件,例如:
D>EDIThello.ASM
进入EDIT的程序编辑画面时,输入汇编语言源程序如下:
DATASEGMENT
MSGDB'HelloWorld!
',0DH,0AH,'$';定义数据段,并初始化待显示的字符串
DATAENDS
STACKSEGMENT'stack'
DB100DUP(0);定义堆栈段
STACKENDS
CODESEGMENT
ASSUMEDS:
DATA,SS:
STACK,CS:
CODE;由ASSUM伪指令定义各段寄存器的内容
START:
MOVAX,DATA
MOVDS,AX
LEADX,MSG
MOVAH,9;调用dos功能,显示字符串
INT21H
movah,4ch;返回dos状态
int21h
CODEENDS
ENDSTART
(二)用汇编程序MASM将ASM文件汇编成目标程序文件(OBJ文件)
当源程序建立以后,仍以hello.asm程序为例,我们用汇编程序MASM对hello.asm源程序文件进行汇编,以便产生机器码的目标程序文件hello.obj,其操作步骤如下:
D>MASMhello.asm
Microsoft(R)MacroAssemblerVersion5.00
Copyright(C)MicrosoftCorp1981–1985,1987.Allrightsreserved.
Objectfilename[ABC.OBJ]:
Sourcelisting[NUL.LST]:
Cross-reference[NUL.CRF]:
50674+450574Bytessymbolspacefree
0WarningErrors
0SevereErrors
(三)用连接程序LINK生成可执行程序文件(EXE文件)
经汇编后产生的二进制的目标程序文件(OBJ文件)并不是可执行程序文件(EXE文件),必须经连接以后,才能成为可执行文件。
连接程序并不是专为汇编语言程序设计的。
如果一个程序是由若干个模块组成的,也可通过连接程序LINK把它们连接在一起。
这些模块可以是汇编程序产生的目标文件,也可以是高级语言编译程序产生的目标文件。
连接过程如下:
D>LINKhello.obj
Microsoft(R)OverlayLinkerVersion3.60
Copyright(C)MicrosoftCorp1983-1987.Allrightsreserved.
RunFile[ABC.EXE]:
ListFile[NUL.MAP]:
Libraries[.LIB]:
(四)程序的执行
当我们建立了可执行文件hello.EXE后,就可直接在DOS下执行该程序:
D>hello.exe或者hello
从而显示HelloWorld!
的结果
五、实验要求与提示
(1)掌握汇编语言程序设计上机过程;
(2)回答思考问题;
(3)记录实验结果。
六、思考与练习以及测评标准
(1)汇编过程中MASMhello和MASMhello.ASM的结果是否一致。
(2)连接过程中LINKhello和LINKhello.OBJ的结果是否一致。
(3)使用记事本如何录入汇编语言源程序。
实验二Debug的使用(基础与验证型)
一、实验要求和目的
熟练掌握动态调试程序DEBUG的使用;
二、软硬件环境
1、硬件环境:
微机CPU486以上,500MB以上硬盘,32M以上内存;
2、软件环境:
装有MASM6.0、Debug、LINK、EDIT等应用程序。
三、实验涉及的主要知识单元
通过编辑、汇编和连接后的程序是可以执行的程序。
但是,一个程序特别是比较复杂的程序不能保证没有一点错误。
因此,在投入正式运行前必须进行调试,以检查程序的正确性。
调试程序Debug就是用来调试汇编语言程序的一种工具。
Debug的主要功能有显示和修改寄存器及内存单元的内容;按指定地址启动并运行程序;设置断点使程序分段运行,以便检查程序运行过程中的中间结果或确定程序出错的位置;反汇编被调试程序,它将一个可执行文件中的指令机器码反汇编成助记符指令并同时给出指令所在的内存地址;单条追踪或多条追踪被调试程序,它可以逐条指令执行或几条指令执行被调试程序,每执行一条(或几条)指令后,Debug程序将中断程序的运行并提供有关结果信息;汇编一段程序,在Debug的汇编命令下可以直接输入助记符指令,并将其汇编成可运行程序段。
此外,Debug还可以将磁盘指定区的内容或一个文件装入到内存或将内存的信息写到磁盘上等等。
启动Debug程序:
在DOS状态下可以用下面的命令启动Debug程序:
DEBUG[路径文件名.扩展名]
Debug后面的文件名及路径是指被调试程序的文件名及路径,Debug后面的文件必须是程序的可执行文件,其扩展名可以是.EXE或.COM。
在此命令后,DOS将调试程序Debug调入内存,Debug接着将被调程序送入内存。
比如:
DEBUG123.EXE
调试程序Debug的主要命令如下:
(一)显示内存单元内容的命令D
格式
(1):
-D地址
从指定地址开始,显示128个字节的内容,每一行的左边显示段内偏移地址,接着显示16个单元的内容,最右边区域则显示这一行的16个单元所对应的可显示的字符。
若无可显示的字符,则用圆点(小数点)填充。
D命令中的地址可为段内偏移量,也可为段基址和段内偏移量两部分,中间用冒号隔开,如1680:
0110,即指段基址为1680H,段内偏移量为0110H。
Debug中所显示的数据均为十六进制数,且省去了后面的H标志。
格式
(2):
-D范围
将显示指定地址范围内的内存单元的内容,起始地址可由段基址及段内偏移量两个部分组成,中间用冒号“:
”隔开,也可以只指出段内偏移量,而此时的段基址在DS中。
这里所说的范围包含起始地址和结束地址。
比如–DDS:
10001020
将显示数据段偏移地址为1000H到1020H的内容。
(二)修改内存命令E
格式
(1):
E地址
从指定地址开始,修改(或连续修改)存储单元内容。
DEBUG首先显示指定单元内容,如要修改,可输入新数据;空格键显示下一个单元内容并可修改,减号键显示上一个单元内容并可修改;如不修改,可直接按空格键或减号键;回车键结束命令。
格式
(2):
E地址数据表
从指定的地址开始用数据表给定的数据修改存储单元。
比如:
-EDS:
100F3‘AB’8D。
(三)检查和修改寄存器内容的命令R
格式
(1):
R
将显示所有寄存器的内容和全部标志位的状态,以及现行CS:
IP所指的机器指令代码和反汇编符号。
格式
(2):
R寄存器名
该格式可用于检查和修改指定寄存器的内容。
若不修改其内容,可按键,若需要修改其内容,可以输入1-4个十六进制数,再按键。
(四)T[=地址]
该命令可以在指令执行中进行追踪,若略去地址,则从CS:
IP现行值执行。
每一次T命令都执行一条指令。
(五)运行程序命令G
格式:
G[=地址][地址[地址…]]
该命令可以在程序运行中设置断点。
它是Debug程序进行程序调试的主要命令之一。
示例:
-g001a则执行从当前cs:
ip至001a的指令,注意:
地址设置必须从指令的第一字节设起。
①第一个参数“=地址”规定了程序执行的起始地址,以CS内容作段地址,等号后面的地址只需给出地址偏移量。
此时,命令G与地址之间的等号不能省去。
如果在G命令执行前,已经设置了CS值和IP值,则也可以直接用G命令,从指定地址执行程序。
②格式中后面给出的地址是指断点地址,最多可设置10个断点。
当程序执行到一个断点时,就停下来,显示CPU各寄存器的内容和标志位的状态,以及下一条待执行的指令,被调试程序的所有断点全部被取消,并返回Debug。
③地址参数所指的单元,必须包含有有效的8088指令的第一个字节,否则将产生不可预料的结果。
④堆栈必须至少包含有6个可用字节,否则也将产生不可预料的结果。
⑤若断点地址只包括地址偏移量,则认为段地址在CS寄存器中。
(六)反汇编命令U
格式
(1):
U地址
该命令从指定的地址开始,反汇编32个字节。
若略去指定地址,则以上一个U命令反汇编的最后一条指令地址的下一条指令地址作为起始地址;若没有用过U命令,则以由Debug初始化的段寄存器的值作段地址,以100作为地址偏移量。
格式
(2):
U范围这种格式的命令,可以对指定范围的内存单元进行反汇编,范围可以由起始地址、结束地址(只能包含地址偏移量)或起始地址及长度来指定。
其命令格式如:
U04BA:
1000108或U04BA:
0100L7
两者是等效的。
(七)退出Debug命令Q
格式:
Q
该命令退出Debug程序并返回DOS。
Q命令并不把内存中的文件存盘,若需要存盘的话,应在退出前用W命令写入磁盘。
四、实验内容与步骤
1、实验内容
(1) 进入和退出Debug程序
(2) 学会Debug中的D命令、R命令、E命令、T命令、G命令、U命、Q命令等的使用。
(3) 利用Debug,验证程序中指令的功能和结果。
(4)使用Debug调试程序调试汇编程序。
2、实验步骤
(1) 在DOS提示符下,进入Debug程序。
(2) 详细记录每一步所用的命令,以及查看结果的方法和具体结果。
(3)求从1开始连续50个奇数之和,并将结果存放在名字为SUM的字存储单元中。
汇编、连结生成了可执行文件test1.EXE,存放在d:
目录下。
请使用Debug对其进行调试。
调试过程:
DATASEGMENT;定义数据段
SUMDW0;定义变量并赋初值
DATAENDS
STACKSEGMENTSTACK;定义堆栈段
DB200DUP(0)
STACKENDS
CODESEGMENT;定义代码段
ASSUMEDS:
DATA,SS:
STACK,CS:
CODE;由ASSUM伪指令定义各段寄存器的内容
START:
MOVAX,DATA
MOVDS,AX
MOVCX,50;累加次数
MOVAX,0;存放累加和
MOVBX,1
NEXT:
ADDAX,BX
INCBX
INCBX
DECCX
JNENEXT
MOVSUM,AX;存放最终累加结果
MOVAH,4CH
INT21H;返回dos状态
CODEENDS
ENDSTART
1进入Debug并装入可执行文件test1.EXE
D:
\MASM>Debugtest1.EXE
-
②观察寄存器初始状态
-R
注:
(1)以上显示的寄存器值,可能和你的电脑显示的不一样。
(2)Debug中默认的进制是十六进制。
③观察数据段中相应位置的值
-D数据段:
偏移地址
使用U命令反汇编
-U从程序存放的位置开始
使用T命令进行单步执行观察结果
使用G命令执行
-G地址(程序终止的偏移地址处)
五、实验要求与提示
1、实验要求
(1)熟练掌握Debug的命令;
(2)熟练掌握使用Debug调试汇编程序;
(3)回答思考问题;
(4)记录实验结果。
2、实验提示
一般使用Debug调试汇编程序的步筹如下:
(1)调用DEBUG,装入用户程序
(2)观察寄存器初始状态
(3)以单步工作方式开始运行程序
(4)观察用户程序数据段初始内容
(5)连续工作方式运行程序
六、思考与练习以及测评标准
(1)如何启动和退出Debug程序。
(2)整理每个Debug命令使用的方法,实际示例及执行结果。
(3)启动Debug后,要装入某一个.EXE文件,应通过什么方法实现?
实验三分支程序设计
知识提要:
本部分内容主要对分支程序加以介绍,其知识要点:
1.无条件转移指令JMP
无条件转移指令JMP是使程序无条件转移至目标处,又分为段内转移、段间转移。
2.条件转移指令JXX
条件转移指令可分为三大类:
1)简单条件转移指令指令。
根据单个标志位的状态判断转移条件。
标志位
指令
转移条件
意义
CF
JC
CF=1
有进位/借位
JNC
CF=0
无进位/借位
ZF
JE/JZ
ZF=1
相等/等于0
JNE/JNZ
ZF=0
不相等/不等于0
SF
JS
SF=1
是负数
JNS
SF=0
是正数
OF
JO
OF=1
有溢出
JNO
OF=0
无溢出
PF
JP/JPE
PF=1
有偶数个1
JNP/JPO
PF=0
有奇数个1
2)无符号数条件转移指令。
假设在条件转移指令前使用比较指令,比较两个无符号数A,B,指令进行的的操作是A-B,其转移指令如下:
指令
转移条件
意义
JA/JNBE
CF=0ANDZF=0
A>B
JAE/JNB
CF=0ORZF=1
A>=B
JB/JNAE
CF=1ANDZF=0
A
JBE/JNA
CF=1ORZF=1
A<=B
3)带符号数条件转移指令。
指令
转移条件
意义
JG/JNLE
SF=OFANDZF=0
A>B
JGE/JNL
SF=OFORZF=1
A>=B
JL/JNGE
SFOFANDZF=0
A
JLE/JNG
SFOFORZF=1
A<=B
一、实验要求和目的
1.熟悉汇编语言程序设计结构;
2.熟悉汇编语言分支程序基本指令的使用方法;
3.掌握利用汇编语言实现单分支、双分支、多分支的程序设计方法。
二、软硬件环境
1.硬件环境:
微机CPU486以上,500MB以上硬盘,32M以上内存;
2.软件环境:
装有MASM6.0、DEBUG、LINK和EDIT等应用程序。
三、实验涉及的主要知识单元
在实际应用中,经常根据一些条件来选择一条分支执行。
汇编语言的条件判断主要是通过状态寄存器中的状态位、无符号数相减或有符号和相减而导致的结果来进行。
下面就有符号数转移指令来了解在汇编语言程序设计方法。
四、实验内容与步骤
1.实验内容
(1)编写计算下面函数值的程序:
设输入数据为X、输出数据Y,且皆为字节变量,使用Debug查看X、Y两个变量的数据。
(2)以ARRAY为首地址的内存单元中,存放若干个8位的带符号数,统计数组中大于等于0的数的个数,并将结果存入RESULT字节单元中。
2.实验步骤
(1)编写程序
(2)对程序进行debug调试,观察中间结果
五、实验要求
1.实验要求
(1)画出各程序流程图;
(2)列出程序清单,加上适量注释;
(3)记录实验结果。
实验四循环程序设计
知识提要:
本节主要对循环结构的组成及其设计方法加以介绍,其知识要点有:
1.循环程序的基本结构通常由3部分组成
(1)初始化部分
建立循环初始值,为循环做准备,如设置地址指针,(BX/SI/DI/BP),初始化循环控制变量或计数器(CX),数据寄存器(AX/DX)初值等.
(2)循环体
循环体是循环程序的主体,是程序中重复执行的程序段.它是由循环工作部分、修改部分、和循环控制部分。
①循环工作部分:
完成程序功能的主要程序段,用于执行程序的实际任务;
②修改部分:
对循环参数进行修改,并为下一次循环做准备;
③循环控制部分:
判断循环结束条件是否满足。
通常判断循环结束方法:
●用计数控制循环;循环是否进行了预定的次数。
●用条件控制循环。
循环终止条件是否满足。
(3)结束处理处理部分
主要是对循环的结果进行处理。
也可没有此部分。
2.循环控制指令
指令格式
执行操作
循环结束条件
LOOP标号
CX=CX-1;若CX=0,则循环
CX=0
LOOPNZ/LOOPNE标号
CX=CX-1;若CX=0且ZF=0,则循环
CX=0或ZF=0
LOOPZ/LOOPE标号
CX=CX-1;若CX=0且ZF=1,则循环
CX=0或ZF=1
JCXZ标号
仅测试(CX)=0,若是,则转移到目标地址,否则就顺序执行
3.循环控制可以分为两种
计数循环和条件循环。
作为计数循环,一般是指循环次数是已知的情况,在程序设计的的循环时,先应将循环次数送入计数器CX中进行计数,在循环体中使用LOOP等循环指令。
当然,也可以通过其他方式来进行,如cx←cx-1,jnz等结合实现。
一、实验要求和目的
1.了解汇编语言循环程序设计的基本流程;
2.熟悉汇编语言循环基本指令的使用方法;
3.掌握利用汇编语言的循环指令完成循环程序设计方法。
二、软硬件环境
1.硬件环境:
微机CPU486以上,500MB以上硬盘,32M以上内存;
2.软件环境:
装有MASM6.0、DEBUG、LINK和EDIT等应用程序。
三、实验涉及的主要知识单元
熟练使用循环指令和跳转等指令来实现循环,理解循环体结构中的初始化部分、循环体、结束部分。
能结合前面分支结构相关的知识点,完成对循环结构的理解和掌握。
同时对循环结构中地址指针的设置,(BX/SI/DI/BP),初始化循环控制变量或计数器(CX)和数据寄存器(AX/DX)初值的设置方法等。
四、实验内容与步骤
1.实验内容
编写程序,设VARY中有一组8位的符号数,编程统计其中正数、负数、零的个数,分别存VM、VN、VK变量中。
提示分析:
设定此数组的元素匀为字节数据,则数组VARY中的数据个数用CNTEQU$-VARY求出,则循环次数为CNT次。
在程序中,要将CNT的值送入CX中。
将数组VARY中元素挨个与0比较,利用状态标志寄存器中的ZF位求出零的个数,利用SF位求出正、负数的个数。
2.实验步骤
(1)预习循环程序设计的方法,根据实验内容,画出流程图;
(2)利用EDIT或其他编辑软件,编写汇编源程序;
(3)汇编、连接该源程序,产生.EXE文件;
(4)对.EXE文件进行调试运行:
利用DEBUG的T命令或G命令和D命令查看数据区,看结果是否正确,并做好主要过程记录。
五、实验要求
1.实验要求
(1)画出各程序流程图;
(2)列出程序清单,加上适量注释;
(3)回答思考问题;
(4)记录实验过程和结果。
六、思考与练习
1.在上述程序基础上,要求修改程序,增加在此数组中找出最大值放入MAX中的同时,找出最小值放入MIN中;
实验五字符及字符串的输入/输出编程实验
一、实验要求和目的
1.熟悉汇编语言程序设计结构;
2.熟悉汇编语言字符串处理基本指令的使用方法;
3.掌握利用汇编语言实现字符的输入输出程序设计方法;
4.掌握利用汇编语言实现字符串的输