微机实验指导书汇编部分本科09101.docx
《微机实验指导书汇编部分本科09101.docx》由会员分享,可在线阅读,更多相关《微机实验指导书汇编部分本科09101.docx(29页珍藏版)》请在冰豆网上搜索。
微机实验指导书汇编部分本科09101
第1章 汇编语言程序设计概述
本章主要介绍了汇编语言源程序的编辑、汇编、连接的方法,DEBUG调试命令及其使用方法
1.1实验系统及开发环境
1.实验设备
硬件设备PC机一台
2.软件开发环境
(1)DOS环境:
编辑软件EDIT.EXE
汇编软件MASM.Exe
连接程序LINK.exe
调试程序DEBUG.EXE
(2)WINDOWS集成开发环境
1.2汇编语言源程序上机过程
在编辑汇编语言源程序时,对计算机硬件工作环境无特殊要求,对软件工作环境要求也很简单。
编辑、汇编、连接、调试过程如图1.1所示。
1.编写汇编语言源程序:
作用:
用汇编语句编写的解决应用问题的程序。
软件工具:
编辑软件,用于输入、建立和修改源程序。
可任选一种编辑软件,不要用格式控制符,要求编辑完成的文件扩展名一定是.ASM。
全屏编辑软件:
WPS、EDIT.COM、NE.COM、WORD、PE等。
行编辑软件:
EDLIN.COM
2.汇编
作用:
将汇编语言程序翻译成机器语言程序的过程,将*.ASM文件转换为*.obj文件。
软件工具:
汇编程序,将汇编语言源程序翻译成机器语言程序的系统。
汇编程序有ASM.EXE、宏汇编MASM.EXE及TASM等,一般使用宏汇编MASM.EXE,因它比ASM.EXE功能强。
TASM适用于8086/8088~Pentium系列指令系统所编写的汇编语言程序,是比较先进的汇编工具。
3.连接
作用:
将不可执行的二进制文件转换为可执行文件,将*.obj文件转换为*.EXE文件。
软件工具:
连接程序LINK.EXE或TLINK.EXE,将MASM.EXE产生的机器代码程序(.OBJ)文件连接成可执行程序.EXE,TLINK比LINK更先进。
4.DEBUG调试程序及辅助工具程序(.EXE)
作用:
进行汇编语言程序调试和文件格式转换
软件工具:
DEBUG.COM动态调试程序
EXE2BIN.EXE文件格式转换程序
CREF.EXE交叉引用程序
TD(turboDebugger简称)也是动态调试程序,可在DOS和Windows环境下运行,用户界面十分友好。
说明:
上述汇编语言源程序上机过程,在DOS环境进行汇编语言程序调试的详细步骤见1.3节;在WINDOWS集成开发环境进行汇编语言程序调试的详细步骤见1.4节
1.3DOS环境进行汇编语言程序调试的详细步骤
1.建立源程序
运行编辑软件,输入源程序。
文件的扩展名为*.ASM
2.汇编
用编辑软件建立的源程序.ASM文件,必须经过汇编才能产生.OBJ文件。
为此,需键入:
C:
>MASM<源文件名>
或C:
>MASM
按前一种格式键入,屏幕上显示:
Microsoft(R)MacroassembleVersion5.00
Copyright(C)MicrosoftCorp1981-1985,1987ALLrightsreserved
OBJfilename[.obj]:
Sourcelisting[nul.lst]:
Cross-reference[nul.crf]:
以上信息中方括中为该项提示的缺省回答值,冒号后面等待用户输入信息,若不改变缺省值则直接按回车键。
汇编后生成以下几个文件:
(1).OBJ文件
.OBJ文件是必须生成的一个目标代码文件,当源程序中无语法错误时,则在当前工作盘上自动存入一个.OBJ文件,供下一步连接用。
若源程序有语法错误时,会出现错误信息提示:
源程序文件行错误信息代码错误说明信息
最后信息提示:
××Warningerrors(警告错误)
××Severeerrors(严重错误)
若严重错误总数不为0,则.OBJ文件没有生成,需回到编辑状态下修改源程序直到无错为止。
(2).LST文件(列表文件)
.LST文件对调试程序有帮助,它是将源程序中各语句及其对应的目标代码和符号表以清单方式列出,如果需要,在屏幕显示的第二个提问的冒号后输入文件名即可,如果不需要,直接按回车键。
(3).CRF文件(交叉引用文件)
交叉引用.CRF文件给出了源程序中定义的符号引用情况,按字母顺序排列。
.CRF文件不可显示,须用CREF.EXE系统程序将.CRF文件转换成为.REF文件后方可显示输出。
若按后一种格式输入,系统会依次出现四个提示信息,比第一种格式多了一项源程序文件名的输入。
应答方式与第一种格式相同。
3、连接目标程序
汇编后生成的.OBJ文件,其所有目标代码的地址都是浮动的偏移地址,机器不能直接运行。
必须用连接程序(LINK.EXE)对其进行连接装配定位,产生.EXE可执行文件,方可运行。
在系统提示符下键入:
LINK<源程序文件名>或LINK
屏幕上出现以下提示信息:
Microsoft(R)MacroassembleVersion5.00
Copyright(C)MicrosoftCorp1981-1985,1987ALLrightsreserved
Runfile[.EXE]:
ListFile[nul.map]:
Libraries[.lib]:
连接后,可生成两种文件:
.EXE和.MAP
(1).EXE文件(可执行文件)
若采用方括号中的默认值,直接按回车键,否则需重新输入一文件名。
若连接过程中无错误,则自动在当前工作盘生成.EXE文件。
若有错误,则会给出错误信息提示,这时必须重新修改源程序,再汇编、连接。
(2).MAP(连接映像文件)
(3).LIB库文件
连接程序询问是否使用某种库文件,不需使用库文件直接按回车键。
(4)若要连接多个模块目标程序,可用“+”把它们连接起来。
如:
LINKfiles1+files2+files3
若直接键入:
LINK会依次出现四个提示信息,应答方式应与LINK<源程序文件>相同,仅增加了一项输出,询问被连接的目标文件名字:
ObjectModeules[.OBJ]:
格式:
LINK;多了一个分号,表示结束后续询问。
4、调试和运行程序
经过汇编、连接后生成的.EXE文件,可在DOS系统直接运行,只要键入相应的文件名即可。
如:
C:
\MASM><文件名>
DOS的COMMAND.COM模块将该程序装配到内存,并设置和分配启动地址。
也可在DEBUG调试程序下运行。
如何用DEBUG程序来运行和调试程序将在DEBUG调试程序中详细讨论。
5、DEBUG调试程序
DEBUG.EXE程序是专门为分析、研制和开发汇编语言程序而设计的一种调试工具,具有跟踪程序执行、观察中间运行结果、显示和修改寄存器或存储单元内容等多种功能。
它能使程序设计人员或用户触及到机器内部,因此可以说它是80X86CPU的心灵窗口,也是我们学习汇编语言必须掌握的调试工具。
(1)DEBUG程序使用
在DOS提示符下键入命令:
C>DEBUG[盘符:
][路径][文件名.EXE][参数1][参数2]
这时屏幕上出现DEBUG的提示符“-”,表示系统在DEBUG管理之下,此时可以用DEBUG进行程序调试。
若所有选项省略,仅把DEBUG装入内存,可对当前内存中的内容进行调试,或者再用N和L命令,从指定盘上装入要调试的程序;若命令行中有文件名,则DOS把DEBUG程序调入内存后,再由DEBUG将指定的文件名装入内存。
(2)DEBUG的常用命令
①汇编命令A
格式:
A[起始地址]
功能:
将输入源程序的指令汇编成目标代码并从指定地址单元开始存放。
若缺省起始地址,则从当前CS:
100地址开始存放。
A命令按行汇编,主要是用于小段程序的汇编或对目标程序的修改。
②反汇编命令U
格式1:
U[起始地址]
格式2:
U[起始地址][结束地址|字节数]
功能:
格式1从指定起始地址处开始将32个字节的目标代码转换成汇编指令形式,缺省起始地址,则从当前地址CS:
IP开始。
格式2将指定范围的内存单元中的目标代码转换成汇编指令。
③显示、修改寄存器命令R
格式:
R[寄存器名]
功能:
若给出寄存器名,则显示该寄存器的内容并可进行修改。
缺省寄存器名,则按以下格式显示所有寄存器的内容及当前值(不能修改)。
AX=0000BX=0004CX=0020DX=0000SP=0080BP=0000SI=0000
DI=0000DS=3000ES=23A0CS=138EIP=0000
NVUPDIPLNZNAPONC
138E:
0000MOVAX,1234
-RAX;输入命令
AX0014;显示AX的内容
:
;供修改,不修改按回车。
若对标志寄存器进行修改,输入:
-RF
屏幕显示如下信息,分别表示OF、DF、IF、SF、ZF、AF、PF、CF的状态。
NVUPDIPLNZNAPONC
不修改按回车键。
要修改需个别输入一个或多个此标志的相反值,再按回车键。
R命令只能显示、修改16位寄存器。
④显示存储单元命令D
格式1:
D[起始地址]
格式2:
D[起始地址][结束地址|字节数]
功能:
格式1从起始地址开始按十六进制显示80H个单元的内容,每行16个单元,共8行,每行右边显示16个单元的ASCII码,不可显示的ASCII码则显示“·”。
格式2显示指定范围内存储单元的内容,其他显示方式与格式1一样。
如果缺省起始地址或地址范围,则从当前的地址开始按格式1显示。
例如:
-D200;表示从DS:
0200H开始显示128个单元内容
-D100120;表示显示DS:
0100-DS:
0120单元的内容
说明:
在DEBUG中,地址表示方式有如下形式:
段寄存器名:
相对地址,如:
DS:
100
段基值:
偏移地址(相对地址),如:
23A0:
1500
⑤修改存储单元命令E
格式1:
E[起始地址][内容表]
格式2:
E[地址]
功能:
格式1按内容表的内容修改从起始地址开始的多个存储单元内容,即用内容表指定的内容来代替存储单元当前内容。
例如:
—EDS:
0100'VAR'1234
表示从DS:
0100为起始单元的连续五个字节单元内容依次被修改为
'V'、'A'、'R'、12H、34H。
格式2是逐个修改指定地址单元的当前内容。
如:
—EDS:
0010
156F:
001041.5F
其中156F:
0010单元原来的值是41H,5FH为输入的修改值。
若只修改一个单元的内容,这时按回车键即可;若还想继续修改下一个单元内容,此时应按空格键,就显示下一个单元的内容,需修改就键入新的内容,不修改再按空格跳过,如此重复直到修改完毕,按回车键返回DEBUG“-”提示符。
如果在修改过程中,将空格键换成按“-”键,则表示可以修改前一个单元的内容。
⑥运行命令G
格式:
G[=起始地址][第一断点地址[第二断点地址……]]
功能:
CPU从指定起始地址开始执行,依次在第一、第二等断点处中断。
若缺省起始地址,则从当前CS:
IP指示地址开始执行一条指令。
最多可设置10个断点。
⑦跟踪命令T
格式:
T[起始地址][正整数]
功能:
从指定地址开始执行‘正整数’条指令,若缺省‘正整数’,表示执行一条指令,若两项都缺省,表示从当前CS:
IP指示地址开始执行一条指令。
⑧指定文件命令N
格式:
N<文件名或扩展名>
功能:
指定即将调入内存或从内存写入磁盘的文件名。
该命令应该用在L命令和W命令之前。
⑨装入命令L
格式1:
L[起始地址][盘符号][扇区号][扇区数]
格式2:
L[起始地址]
功能:
格式1根据盘符号,将指定扇区的内容装入到指定起始地址的存储区中。
格式2将N命令指出的文件装入到指定起始地址的存储区中,若省略起始地址,则装入到CS:
100处或按原来文件定位约定装入到相应位置。
⑩写磁盘命令W
格式1:
W<起始地址>[驱动器号]<起始扇区><扇区数>
格式2:
W[起始地址]
功能:
格式1把指定地址开始的内容数据写到磁盘上指定的扇区中。
格式2将起始地址的BX×10000H+CX个字节内容存放到由N命令指定的文件中。
在格式2的W命令之前,除用N命令指定存盘的文件名外,还必须将要写的字节数用R命令送入BX和CX中。
⑾退出命令Q
格式:
Q
功能:
退出DEBUG,返回到操作系统。
以上介绍的是DEBUG常用命令,其他命令请参考有关书籍。
1.4WINDOWS集成开发环境进行汇编语言程序调试的详细步骤
1.实验内容及编程
实验内容:
从3500H内存单元开始建立0~15共16个数据(建立的数据为00H,01H~09H.0AH~0FH)。
并运行之,检查记录程序的结果。
分析①:
3500H为偏移地址,对应的段基址采用默认的DS当前值;程序仅给出代码段即可。
②程序中,如果不涉及到堆栈,则堆栈段可省略;
实验程序及流程如下:
DATASEGMENT
ORG3500H
MEM1DB16DUP(?
)
DATAENDS
CODESEGMENT;定义代码段
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDI,3500H;程序开始设数据区首址
MOVCX,0010H;字节数送入CX中
MOVAH,00H;
SAHF;清标志寄存器指令
MOVAL,00H
A1:
MOV[DI],AL;写入一字节
INCDI;修改地址指针
INCAL;修改数据
LOOPA1;未填完转移
CODEENDS;代码段结束
ENDSTART;程序结束
2.实验过程及详细步骤
第1步输入源程序
打开WINDOWS环境下的汇编开发环境,输入源程序。
在桌面上找到快捷方式图标,如图1-1所示,双击;
图1-1
出现下面的源程序模板,如图1-2:
按提示输入源程序。
图1-2汇编源程序模板
图1-2说明:
在右侧窗口输入源程序,段结构模板已经给出,注意,你可以自己定义段名,没有涉及到的段可省略不写。
输入源程序程序后,保存程序(规定扩展名为*.ASM),使用ALT+X返回集成软件环境。
输入源程序后,见图1-3所示。
图1-3输入源程序后的界面
第2步:
汇编
编译/汇编成目标文件,如图1-4所示.
汇编信息显示于屏幕下面的窗口中,显示编译成功,进行第3步。
如果显示错误提示信息,则返回第1步修改源程序。
图1-4编译/汇编命令
第3步:
连接
连接生成可执行文件,如图1-5,对汇编生成的*.obj文件进行连接,连接信息显示于屏幕上,生成相应*.EXE可执行文件。
如果连接成功,显示生成.EXE文件成功,进行下一步DEBUG调试。
否则,返回第1步,修改源程序。
图1-5连接命令
第4步:
在DEBUG调试环境下进行程序的调试过程
目的:
检查程序的每一条指令及程序的执行结果。
单击DEBUG调试,如图1-6所示,进入DEBUG调试环境(如图1-7所示),此时待调试的程序已装入内存。
图1-6debug调试命令
图1-7debug调试环境窗口
①在图1-7中键入反汇编命令:
进行反汇编,显示内存装入的机器指令用汇编指令表示,命令如下:
在“>”提示符下键入:
U↙回车;从当前的IP指令指针开始反汇编;
或
U0000↙回车;从起始偏移地址0000H开始反汇编;
如图1-8所示。
图1-8反汇编结果
图1-8说明:
●键入U命令后,屏幕显示装入的汇编程序;
●当源程序较长时,再次键入U↙回车,继续显示后面的程序,直到屏幕上出现该调试程序的结尾语句;
●在反汇编出来的程序中,符号地址已经用当前内存的地址表示,段寄存器已经装入了具体的段基址;
●数据和地址全部用十六进制,省略H不写。
●第1,2列,为程序所在内存的地址,为段地址:
偏移地址的形式;
第3列,为汇编指令对应的机器指令
第1~10行为你所编写的程序,注意你自己的程序的结束语句,1B3C:
0017B44CMOVAH,4C
1B3C:
0019CD21INT21
该指令之后的指令,为内存驻留的其他内容,与你的程序没有关系
调试过程综述:
②运行程序
运行程序可以用三种方式:
单步运行、设断点运行、连续运行等方式,具体操作如下:
a.单步运行
目的:
每运行一条指令后显示当前寄存器的内容及下一条待执行指令。
在“>”提示符下键入T=0000↙;,表示从偏移地址0000H开始执行一条语句;显示的结果见图1-9,屏幕显示的是CPU所有寄存器的内容,你仅查看与你的程序有关的寄存器结果,在这里,第一条指令的结果为:
DI=3500H;
继续执行下一条指令,在“>”提示符下键入T↙;反复键入T命令,就可一步一步地运行,直至程序最后一条语句结束。
图1-9单步调试
b.连续运行:
在“>”提示符下键入G=00000016↙(系统默认段基址CS情况下,可不写段基址),该命令表示从偏移地址0000开始执行到0016结束,可连续运行程序。
图1-10所示
③内存单元内容的显示:
程序结束后,使用D17EB:
3500↙可查看17EB:
3500H单元开始的内存中的数据。
17EB是DS的内容,3500是DI的内容。
内存显示方法,每行16个字节,用16进制表示。
图1-11所示,17EB:
3500~350F是程序的运行结果.
图1-11
③内存单元内容的修改:
要若修改某一单元内容,使用E命令,可进行如下操作,例,修改3500~3505单元的内容为FF,见图1-12。
再用D命令查看内存时,内容已有变化。
其中,“空格”键用于向下一个单元输入数据,用↙来响应,并退出E命令。
图1-12所示
④程序运行结束,请分析和记录结果。
DEBUG调试的其他命令,见表1-1
第2章80X86汇编语言实验
1.实验设备
硬件:
PC计算机一台;软件,汇编软件
2.实验目的
1.熟悉汇编语言程序设计方法;
2.熟悉汇编程序调试过程;
3.掌握使用数据传送、运算类、转移等指令编程及调试方法。
4..掌握顺序结构、分支结构、循环结构和子程序调用的编程方法。
3.实验及实验报告要求
①.编程、调试、运行、检查结果,并记录,
要求:
对程序反复输入几组数据,并运行程序,观察记录结果。
②实验报告要求
实验报告中应包含实验内容、源程序、实验步骤、运行结果、分析结果是否正确及存在的问题。
实验一系统认识实验
1-1.从3500H内存单元开始建立0~15共16个数据(建立的数据为00H,01H~09H.0AH~0FH)。
并运行之,检查记录结果。
实验步骤见1.4节。
1-2.如果建立的数据为BCD码表示的十进制数据(建立的数据应为00H,01H~09H,10H~15H),应如何修改上述程序.并运行之,检查记录结果。
提示:
BCD运算,是二进制编码的十进制运算,使用指令ADD和DAA或INC和ADD共同完成,仅能使用AL进行运算。
1-3.编程完成1+2+3+4+5+6+7+8+9运算。
1-4.编程完成1+2+3+4+5+6+7+8+~+100运算。
1-5.将内存3500H单元开始存放的0~9共10个字节数传递到3600H单元开始的数据区中。
提示:
该程序应该编写数据段,存放0~9共10个数。
如果要求偏移地址从3500H开始存放已知的数据应该如何编程?
下面的数据段程序有何区别?
数据段定义:
通常定义的数据段格式如下:
DATASEGMENT
MEM1DB0,1,2,3,4,5,6,7,8,9
MEM2DB10DUP(?
)
DATAENDS
该程序段定义的数据区段基址为DS表示,偏移地址从0000H开始的内存区开始存放数据。
如果指明开始的偏移地址从3500H开始存放数据,3600H开始接收数据,则数据段定义为:
DATASEGMENT
ORG3500H
MEM1DB0,1,2,3,4,5,6,7,8,9
ORG3600H
MEM2DB10DUP(?
)
DATAENDS
1-6.在5题中,如果采用字数据传送,应该如何修改程序?
并运行之,检查记录结果。
1-7.在5题中,如果采用串传送指令(MOVSB,MOVSW指令)如何修改程序?
并运行之,检查记录结果。
1-8.设计一数据块间的搬移程序
设计思想:
程序要求把内存中一数据区(称为源数据块)传送到另一存储区(称为目的数据块)。
源数据块和目的数据块在存储中可能有三种情况:
如图
(1),对于两个数据块分离的情况,数据的传送从数据块的首址开始,或者从数据块的末址开始均可。
但对于有部分重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭破坏,可以得出以下结论:
如图
(2)当源数据块首址<目的块首址时,从源数据块末地址开始传送数据。
如图(3)当源数据块首址>目的块首址时,从源数据块首地址开始传送数据。
实验二顺序、分支、循环编程实验
2-1.编程完成Z=3x+4y-4,其中x、y、z为字节单元。
问题1,如果x、y为字节单元,z为字单元,如何修改程序,并运行,给出结果
2-2、编程求若干字节数的累加和,和的结果小于32767(即累加和不超过16位二进制数。
2-3、从BUFFER单元开始存放若干数据,求其中负数的个数存入MDAT字节单元中。
2-4.修改程序3,使其能求出数据区中正数的个数,存入PDAT单元中。
2-5.求某数据区内正数、负数和零的个数,分别放在PDAT,MDAT,ZDAT单元中。
2-6.将某数据区内正数、负数和零分别放在PDAT,MDAT,ZDAT开始的单元中。
2-7、求无符号字节序列中的最大值,放入MDATA单元
2-8.求有符号字节序列中的最小值,放入NDATA单元
2-9.若求有符号字型序列中的最大值和最小值,放入MDATA单元和NDATA单元
2-10,.调用DOS功能,在屏幕上显示0~9.
2-11、调用DOS功能,在屏幕上显示0+1+2+3的结果。
2-12、调用DOS功能,在屏幕上显示0+1+2+3+4+5+6+7+8+9的结果。
实验三作业编程实验
3-1、教材习题3.12
已知从DS:
2200H,ES:
3200H单元起分别存放20个ASCII的字符。
找出这两个字符串中第一个不同字符的位置(段内偏地址),并放入DS:
22A0H开始的连续两个字单元中。
请设计完成此任务的程序段。
(1)使用通常用的比较指令(CMP)实现;
(2)使用数据串比较指令(CMPSB)实现。
3-2、教材习题3.21
编写程序段,在数据区0000H:
2000H开始100字节范围内,查找字符'A',若找到,则将偏移地址送入DX,没有找到,则结束。
3-3、教材习题3.33
编程实现求S=(X2+Y2)/Z的值,并将结果放入RESULT单元。
3-4、教材习题3.34
在数据区中,以TABLE开始连续存放0~6的立方值(称为立方表),设任给一数x(0≤x≤6),x在TAB1单元,查表求x的立方值,并