汇编语言实验讲义.docx
《汇编语言实验讲义.docx》由会员分享,可在线阅读,更多相关《汇编语言实验讲义.docx(38页珍藏版)》请在冰点文库上搜索。
汇编语言实验讲义
前言
汇编语言程序设计是计算机软件设计技术的基础,也是计算机各专业人员的一门必修课程.它对于深入了解计算机的工作原理,掌握程序设计技术,从事计算机高层次应用和软,硬件开发以及计算机接口技术具有重要的作用.
汇编语言是介于计算机能直接理解的机器语言与使用者容易理解的高级语言之间的一种语言.它除有与代码指令一一对应的符号(助记符)指令外,还增加了专用于定义变量,常量,符号,过程,分配存储空间,定位程序起始地址等一系列称之为伪指令的符号指令.它面向机器,能全面反映计算机硬件的功能和特点,但是比机器语言易于阅读,编写,和修改程序.因此,使用汇编语言可编写出运行速度快,占存储空间少,充分利用硬件资源,进行适时控制的程序.尽管目前存在着独立于计算机的上千种高级语言,汇编语言仍作为一种强有力的软件工具显示出它的重要性.汇编语言是面向机器的语言,它因计算机的类型不同而异.本语言是属IBMPC及其兼容机系列(80X86/8088),但是用汇编语言进行程序设计的基本概念,基本技巧和方法是普遍使用的,掌握一种系列的汇编语言程序设计,其它便可触类旁通.
用汇编语言进行程序设计比用高级语言复杂和困难的多.因此,学习汇编语言需要更多的上机实践;这对于加深理解课程的基本概念和掌握语言编程技术至关重要.根据<<计算机应用>>专业对<<汇编语言程序设计>>教学大纲的要求并结合多年的教学实践和参考其他院校的资料编写了这本实验指导书,其中包括一周的课程设计指导.
本书共分两大部分.第一部分共包括十四个实验共三十多道题,内容覆盖了本科教学大纲要求的范围.实验一,二主要目的是熟悉汇编语言程序设计中常用的工具软件以及对汇编语言有一个初步了解.实验三到十三的内容是汇编语言程序设计中的基本组成.其余是有关接口的实验.在二十个机时的实验中,要求学生至少完成其中十道关于各章节的基本题,其余的题供有余力的同学选做或在课余时间完成(专科学生按教学大纲要求相应减少).第二部分是课程设计指导,包括八道综合性程序设计题;它要求学生在一周近二十个机时内至少完成其中的一道大题.书中对于每道题都有提示,有些给了流程图.但是,这些都只供参考;它们不一定是最佳方案,更不是唯一的.在有限的语句和语法范围内,为同一目的的编程可以是多种多样,风格迥异;这就象写同一题目的作文一样,可以千差万别.为了提高上机实践的效率,希望同学们提前做好预习,最好能提出一个或多个设计方案.
本实验指导书是在原试用稿的基础上全面扩充完成,希望使用者继续发现不足之处,提供意见和建议,以便今后的进一步完善.
实验一
[实验目的]
学习汇编语言程序设计的基本步骤,即编辑(EDIT)程序、汇编(MASM)、连接(LINK)和和运行。
其中包括源程序的书写格式,一种全屏幕编辑软件、宏汇编软件MASM、连接软件LINK的使用。
通过实验对汇编语言程序设计有一个初步的认识。
[实验内容]
1、学习使用全屏幕文本编辑软件EDIT。
用EDIT输入一段给定的源程序(例1、例2)。
2、用MASM对已存盘的源程序进行汇编,形成目标文件(.OBJ);如有错误,再返回到EDIT进行修改。
3、用LINK对上述形成的目标文件进行连接,形成可执行文件(.EXE)
4、在DOS提示符下运行该可执行文件。
[有关EDIT的使用方法]
编写源程序可用多种文本编辑软件,如行编辑EDLIN、WORDSTAR(WS)某些高级语言集成开发环境的编辑器等等;这里简要介绍EDIT的使用方法。
EDIT是DOS5.0以上版本提供的一种简洁方便易学且流行风格的全屏幕编辑软件,一般微机都有。
1.进入EDIT;在DOS提示符下键入EDIT回车,即可进入EDIT环境。
可以看到它的主菜单包括:
File(文件)、Edit(编辑)、Search(查找)、Option(选择)、Help(帮助)。
2.可用键盘或鼠标操作选择菜单。
这里只介绍键盘操作方法。
按Alt键激活主菜单。
用←→键移动光标选择主菜单,或按下菜单名中高亮字符键进行选择。
也可一开始就按Alt+主菜单中第一字符键选择主菜单。
3.每个主菜单被选择后,会出现一对应的下拉菜单。
用↑↓键移动光标选择某项功能,或直
接按某项高亮字符,即可。
4.主菜单FILE的使用。
在FILE中有NEW,OPEN,SAVE,SAVEAS,PRINT,EXIT等项,分述如
下:
(1)NEW建立一个新文件;其实在一进入EDIT后就是该功能项。
此时,文件的标题是
UNTILED(无名);可进行文件输入。
(2)OPEN…打开一个已存在的磁盘文件;此时会出现一个大窗口,你可用TAB键(或
SHIFE+TAB)进入各小窗口选择响应的磁盘符,目录及文件名。
你也可以在要进入EDIT时,在DOS提示符下键入EDIT后再键入(盘符,路径)文件名,回车即可。
(3)SAVE把编写或修改过的文件存盘;若是一个无名新文件,则有一窗口提示你输入一文件名;有名文件直接存盘。
此项操作后不退出EDIT。
(4)SAVEAS…把在编辑文件改用另一名称存盘;不退出EDIT。
(5)PRINT…打印(此项省略)。
(6)EXIT退出EDIT。
若是一新文件或修改过的文件,则有一窗口提示,问你当前文件是否要存盘,当前选项YES是存盘,直接按回车;若不想存盘,按键‘N’,或用TABLE键选NO,按回车。
次项操作有退出EDIT。
5,主菜单EDIT的使用。
在EDIT中有CUT,COPY,PASTE,CLEAR等项。
EDIT提供的“块操作”功能给文本编辑带来很大方便。
步骤如下:
(1)要用块操作功能,首先要在编辑的文本的屏幕上定义一个“块”;否则,该菜单各
项不被激活而呈灰色。
定义“块”的法官年法是:
把光标移动到要定义的块首,然后按下
SHIFT键,再按下SHIFT,再按下→或←键(块向行方向扩展),再按下↑或↓键(块向列方向扩展)。
被定义的块以反显颜色呈现。
(2)选择菜单EDIT,其中CUT,COPY,CLEAR等项激活;选CUT,就是把定义块“剪下”放在一个所谓的剪贴板上(此处看不见);选COPY,就是把定义块复制到剪贴板上;选CLEAR,就是把定义块清除掉。
(3)定义块被CUT或COPY后,菜单PASTE(粘贴)被激活后,说明剪贴板上有内容。
此时,把光标移动到你要插入“块”的位置,然后选PASTE,剪贴板上的内容就复制到光标所在处。
注:
“剪贴板”只能存放一个“块”的内容;“剪贴板”上的内容可多次“粘贴”。
6。
主菜单SEARCH的使用。
此菜单包括FIND。
。
。
REPEATLASTFIND,CHANGE等项。
它们提供在被编辑的文本中查找或替换某一指定的字符串的功能。
(1)FIND……:
此选项,出现一对话框,首先输入查找的字符(串),然后有两项选
择:
[--]MathUpper/Lomercase是否区分字符的大小写?
用空格键选择,[]中出现×表示
要。
[--]Wholeword所选字符(串)在文件中是否为一完整单词?
选择方式同上。
例如:
在
文中有FOR,INFORMATION,FORMAT等字符串,现在要查找‘FOR’,若作为一完整单词,就只能找到FOR,否则其他包含‘FOR’的字符串也可查找到。
(2)REPEATLASTFIND:
上述FIND只能找到第一个目标(从光标位置开始);而REPEAT
项可继续向后重复上一次的查找。
此项可按F3键执行。
(3)CHANGE:
替换字符串。
选此项,出现一对话框;首先在‘FindWhat’窗口输入查找内容,然后按TAB键进入下一窗口‘ChangeTo’输入替换内容;接下来的两项选择同FIND项。
最后的选择是〈FindandVerify〉,〈ChangeAll〉,〈Cancel〉等;用TABLE键选
择。
它们分别是:
找到一个目标后再选择是否替换,把所有查找到的目标一次性替换,取
消。
7,主菜单OPTION:
其主要功能是改变屏幕前景和背景颜色。
〈省略〉
8,主菜单HELP:
提供帮助。
除此之外,在文本编辑的过程中,你可随时按F1键求得及时帮助。
[汇编语言程序的编写格式]
汇编语言程序一般由几个段组成,它们分别是堆栈段,数据段,代码段。
任何一个源程序
至少必须有一个代码段和一条作为源程序结束的伪指令END。
段的定义有两种格式,分述如
下:
1,完整的段定义格式(教科书中常用的):
一个段由段头,段体,段尾组成,形式如下:
段名SEGMENT[定位类型][组合类型][‘类别’]
…
…
段名ENDS
其中SEGMENT后的参数一般可省略,详细说明参阅后面的有关章节。
2,简化的段定义格式(MASM5.0版本提供)每段以.开始后跟固定的段名,一般形式如下:
DOSSEG
.MODEL存储类型;“存储类型”可选择为SMALL。
.STACK[大小];堆栈段,“大小”指定堆栈的字节数。
.DATA;数据段。
.CODE[名字];代码段;一般只有一个代码段,名字可缺少
…
…
例1:
用完整的段定义编写一源程序。
NAMEEXAM1;可以省略
DATASEGMENT;定义数据段,以下是数据段的内容
STR1DB“HELLO,WELCOME!
”,13,10,‘$’
STR2DB“DOYOULIKECOMPUTER?
(Y/N)”,1310,‘$’
STR3DB“NICE!
”,13,10,‘$’
STR4DB“SORRY!
”,13,10,‘$’
STR5DB“UNKNOW,ANSWERAGAIN!
(Y/N)”,
DB13,10,‘$’
STR6DB“SEEYOUNEXTTIME!
”,13,10,‘$’
DATAENDS;数据段结束
CODESEGMENT;定义代码段
ASSUMECS:
CODE;DS:
DATA;以下是代码段内容
START:
MOVAX,DATA;给数据段寄存器赋值
MOVDS,AX
MOVAH,9;显示一字符串的功能号
MOVDX,OFFSETSTR1;显示字符串STR1的偏址
INT21H;DOS功能调用
ASK:
MOVDX,OFFFSETSTR2;显示字符串STR2
INT21H
MOVAH,1;键盘输入一字符的功能号
INT21H;键入的字符ASCⅡ码在AL
NOTAL;求反
TESTAL,‘Y’;是否按下‘Y’或‘y’键
JENEXT1
TESTAL,‘y’
JENEXT1
TESTAL,‘N’;是否按下‘N’键或‘y’键
JENEXT2
TESTAL,‘n’
JENEXT2
MOVDX,OFFSETSTR5;不是按上述键
MOVAH,9
INT21H
JMPASK;再返回ASK
NEXT1:
MOVDX,OFFSETSTR3;是按下‘Y’或‘y’键
MOVAH,9
INT21H
JMPBYE
NEXT2:
MOVDX,OFFSETSTR4;是按下‘N’或‘n’键
MOVAH,9
INT21H
BYE:
MOVDX,OFFSETSTR6
INT21H
MOVDL,7;喇叭响的ASCⅡ码
MOVAH,2
INT21H
MOVAH,4CH;退回DOS
INT21H
CODEENDS;代码段结束
ENDSTART;源程序结束
注:
源程序中的每一行注释语句前一定要加分号‘;’,下同。
例2;用简化的段定义编写一源程序。
TITLEHELLO;可省略
.MODELSMALL
.STACK100H;可省略
.DATA;数据段开始
MESSAGEDB“MAKETHEWORLDFULLWITHLOVE!
”,DB13,10,‘$’
.CODE;数据段结束,代码段开始
GO:
MOVAX,@DATA
MOVDS,AX;给数据段寄存器赋值
LEADX,MESSAGE
MOVAH,9
INT21H
MOVCX,10
MOVAH,2
NEXT:
MOVDL,7;喇叭连续响10次并显示10个‘*’
INT21H
MOVDL,‘*’
INT21H
LOOPNEXT
MOVAH,4CH
INT21H
ENDGO
[宏汇编程序MASM的使用]
MASM是一个系统文件,它最主要的功能是把由汇编语言编写的源程序翻译成机器码,即目标代码。
除此之外,它还完成对源程序进行语法格式检查,给出错误信息,分配存储区域,把各种进制的数转换成二进制,把字符转换成ASCⅡ码,并计算表达式的值(具体过程可参阅清华出版的教科书第13章第一节)。
源程序编写好并存盘后,接着的工作是用MASM对源程序进行编写,以产生相应的机器码目标程序。
下面为了叙述方便,我们假设MASM和名为MY.ASM的源程序都存放在C盘。
有两类运行MASM的方式,分述如下:
方式1.使用提示的汇编
C》MASM回车;启动MASM
屏幕上显示有关MASM版本的说明《略》;以下按屏幕提示输入:
Sourcefilename[.ASM]:
MY回车;输入源程序文件名
Objectfilename[.OBJ]:
回车;输入目标程序文件名,一般直接回车,名同源程序。
Sourcefisting[NUL.LST]:
MY回车;输入一名,生成列表文件。
若直接回车,就不生成该文件。
Cross-reference[NUL.CRF]:
MY回车;生成交叉引用文件。
若直接回车,就不生成该文件。
这时便开始对源程序进行汇编。
如源程序有错误,则给出有关错误信息(错误语句,错误代码,错误性质)。
因此,要返回到文本编辑中(如EDIT)进行修改源程序,再汇编,直到没有错误为止,此时显示:
WarningSevere
ErrorsErrors
00
关于列表文件(.LST)和交叉引用文件(.CRF)的用途可参阅教科书及其它资料;我们一般不需要生成它们,而只要目标程序(.OBJ)。
方式2.使用命令行汇编:
格式1:
C>MASMMY,,,;回车。
它等效与下列命令,生成目标,列表,交叉文件
C>MASMMY.ASM,MY.OBJ,MY.LST,MY.CRF回车。
格式2:
C>MASMMY;回车只生成目标文件(OBJ),注意:
分号‘;’不可缺少。
[连接程序LINK的操作]
由汇编程序建立的目标码文件还不能直接上机运行,必须经过连接之后才能成为可执行文件(.EXE)。
(详细内容参阅教科书第13章第2节)。
格式:
C>LINK目标文件名;回车
或C>LINK目标文件名;回车
屏幕显示LINK版本说明,以下按屏幕提示输入:
ObjectModules[.OBJ]:
目标文件名;若LINK后有文件名,则直接回车。
RunFile[文件名.EXE]:
回车;可执行文件名同目标文件。
ListFile[NUL.MAP]:
文件名回车;内存分布图文件,若不要,可直接回车。
Libraries[.LIB]:
回车;没有库文件,直接回车。
如果有多个要连接的目标文件,应一次键入,每个目标文件名用‘+’号相间隔(本实验例题都是一个文件)。
当回答完以上问题后,连接程序开始连接。
若连接过程有错,则显示有关错误信息。
如:
Warning:
Nostacksegment
Therewas1errordetected
在源程序中美哟定义用户堆栈段,会出现差警告信息,可忽略它。
但是,若出现Severeerror,必须重新编辑源程序找出错误原因,然后重新汇编,再经过连接,直至无错。
【运行程序】
连接成功后生成的可执行(.EXE)文件,可以在DOS提示符下直接键入文件名(不必要扩展名)运行此程序。
如:
运行例1(假设生成的可执行文件名为EXAM1.EXE)
C>EXAM1回车
屏幕显示:
HELL,WELLCOM!
DOYOULIKECOMPUTER?
(Y/N)
……
实验二调试程序DEBUG的使用
DOS提供的动态调试程序DEBUG是一个专门为汇编语言设计的调试工具;它有很强的功能,可用来调试和修改汇编语言可执行程序。
在DEBUG管理下,可单步执行程序;也可以在执行程序中设置断点;可以显示和修改指定范围的内存内容;可以显示和修改cpu内部寄存器和标志位的内容;还可以直接用汇编语言编写可执行程序,并可存盘等。
因此很容易寻找程序中的错误,一旦发现错误,既可以在DEBUG中修改,也可重复前述的编辑,汇编,连接过程,直到程序能够正确运行为止。
[实验目的]
1.掌握DEBUG的主要命令。
2.学习使用DEBUG调试汇编语言程序。
[实验内容]
1.在DEBUG中输入一段汇编语言程序;用DEBUG命令对它进行调试,存盘。
2.用DEBUG调试一个上次存盘的可执行文件。
[DEBUG主要命令的使用说明]
1.DEBUG的启动
C>DEBUG[D:
][PATH][FILENAME[.EXE]];方括号中是任选项。
进入DEBUG后,提示符是“_”。
2.DEBUG命令
(1)汇编命令A
-A[地址];若不指定地址,但前面用过A命令,则接上一个地址;
若前面未用过A命令,则从cs:
100单元开始。
输入汇编语句,A命令把它们汇编成机器码后,从指定的地址单元开始连续存放。
进入A命令后输入一段程序(以下段址cs是假设的,不同机器和不同情况下此值不同):
-0D7B:
0100JMP110
-0D7B:
0102DB41,42,43,7
-0D7B:
0106DB61,62,63,7,0D,0A
-0D7B:
010CDB'OK',0D,0A
-0D7B:
0110MOVSI,102
-0D7B:
0113MOVCX,0D
-0D7B:
0116MOVAH,2
-OD7B:
0118MOVDL,[SI]
-OD7B:
O11AINT21
-0D7B:
011CINCSI
-OD7B:
011DLOOP118
-0D7B:
011FMOVAH,4C
-OD7B:
0121INT21
-0D7B:
0123^C;结束
-
用复合键CTRL+C结束汇编命令A,返回DEBUG提示符_。
注:
1.输入时,一行回车后,若发现错误,只有在'_A地址回车'后重新输入。
2.DEBUG中不允许用标号,只能用地址值。
3.DEBUG中数字都是16进制。
(2)反汇编命令U
格式:
_U[地址]回车或_U[首地址][末地址]回车
把一段机器码反汇编成汇编语言指令形式。
如上述汇编命令A结束后执行:
_U回车或_U100回车显示如下:
0D7B:
0100EBOEJMP0110
0D7B:
010241INCCX
0D7B:
010342INCDX
0D7B:
010443INCBX
0D7B:
010507POPES
0D7B:
010661DB61
0D7B:
010762DB62
0D7B:
010863DB63
0D7B:
010907POPES
0D7B:
010A0D0A4FORAX,4F0A
0D7B:
010D4BDB4B
0D7B:
010E0D0ABEORAX,BE0A
0D7B:
01110201ADDAL,[BX+DI]
0D7B:
0113B90D00MOVCX,000D
0D7B:
0116B402MOVAH,02
0D7B:
01188A14MOVAH,02
0D7B:
011ACD21INT21
0D7B:
011C46INCSI
0D7B:
011DE2F9LOOP0118
0D7B:
O11FB44CMOVAH,4C
0D7B:
0121CD21INT21
……
显示一屏后,若继续用U命令,则会接上一屏最后地址继续反汇编显示。
(3)显示和修改寄存器的命令R
格式:
_R回车显示cpu内部所有寄存器的内容和全部标志位状态。
格式:
_R寄存器名回车显示指令寄存器内容并可在':
'后键入新值,或直接回车。
如:
_RCX
CX:
0060
:
0A25
(4)显示和修改标志的命令RF
PSW的各标志位状态用符号依次表示如下:
置位
(1)OVDNEINGIRACPECY
复位(0)NVUPDIPLNZNAPONC
命令格式:
_RF此后系统用上述符号给出各位信息。
此时,若不修改任何位,可直接按回车;若要修改一个或多个位,则要键入此标志相反符号,输入顺序无关,符号之间可无空格,所有输入结束按回车。
(5)显示内存命令D
格式:
_D[地址]回车;或_D[首址][末址]回车;
地址可指定段址:
偏址,如:
_D3212:
0110或_DCS:
123或_D123
例:
_D100120回车;列出当前段从100到120字节的内容
0D7B:
0100EBOE4142430761626307……
0D7B:
0110BE0201……
……
再运行D,接上面最后一个地址继续显示.
(6)修改内存命令E
格式1:
_E[地址]回车
该命令是一个单元一个单元地修改;屏幕上显示出指定单元的修改后,若要修改,就输入新值,否则可按空格键显示下一单元的内容;按'_',则显示前一单元内容;按回车键结束E命令.
格式2:
_E[地址][内容表]回车
该命令是用给定内容代替从指定地址开始的内存单元的内容.
例:
_EDS:
200,F2,"ASDF",8C回车
是用表中给定的内容依次代替DS:
200开始的6个字节的内容;引号中的字符将是它们的ASCII码值.你可用命令D检验该结果.命令行中用逗号分隔处可用空格代替;下同.
(7)填充内存命令F
格式:
_F地址范围][内容表]回车
该命令将内容表中的值依次填入指定范围;表中的长度小于指定范围时,内容重复使用.
例:
_F0D7B:
200L10'ABC',AB,6C回车
是用指定的5个字节填充从0D7B:
200开始的10H个存储单元.地址范围可用首址与长度的方式表示,如上述200L10,也可用首址与末址表示,如200-210;两者等效。
下同。
(8)移动命令M
格式:
_M[源地址范围][目标首址]
该命令将源地址范围的内容复制到目标地址开始的内存区。
例:
_MCS:
130140200回车
把CS:
130到140的17个字节的内容,搬到DS:
200开始的内存区。
注意,目标地址未指定段址,则默认为DS;目标地址和源地址可以重叠,但重叠部分内容被覆盖。
(9)查找命令S
格式:
_S[地址范围][内容表]回车
该命令查找指定范围内符合内容表指定内容的地址。
若找到,则显示它们的地址,找不到,则返回DEBUG提示