汇编语言实验讲义.docx
《汇编语言实验讲义.docx》由会员分享,可在线阅读,更多相关《汇编语言实验讲义.docx(19页珍藏版)》请在冰点文库上搜索。
汇编语言实验讲义
《汇编语言》课程实验指导手册
汇编语言程序设计技术是实践性很强的课程。
实践也是学好程序设计课程中必不可少的重要环节。
程序设计的实践分两个步骤:
一是设计和编写解决问题的程序算法流程,并在此基础上编写源程序代码;二是在计算机上对程序进行调试,并使程序完成问题的求解过程,进行相应的逻辑测试。
由于汇编语言固有的特点,其程序调试比一般的高级程序语言困难,为此,学习过程中,尤其注意事先做好上机准备,做到目的明确,思路清晰,调试策略完全、全面,以便更好地观察和分析汇编程序执行的技巧,并注意领会计算机工作的本质过程和步骤。
可以参阅计算机组成原理方面的参考书,帮助理解计算机的基本工作原理。
实验过程中,应当注意如下问题:
(1)上机实习的主要目的是训练汇编语言程序的上机调试能力和分析、解决调试过程中遇到的问题的能力。
并在此过程中逐步提高程序编写与问题分析能力。
而不是简单地对教材上的实例做验证式的操作;
(2)上机内容可以结合教材内容和习题,或由老师布置专门的上机习题进行;
(3)为提高上机效果。
必须在上机之前准备好上机的基本内容并编写好上机程序,尽量在上机之前先作好预先的阅读分析工作;
(4)上机调试的基本方法:
语法检查(编译)==>逻辑检查(设计者检查)==>测试。
上机实验的主要步骤:
(1)了解实验目的和要求,并复习或阅读相关教材内容;
(2)根据题目要求,事先编写好程序,并经过设计者静态检查程序的语法正确性和逻辑正确性,分析可能出现的问题;
(3)设计好上机时准备测试程序的用例;
(4)上机调试通过程序,并记录上机调试中出现的问题和测试结论等,写出实验报告。
调试过程中,尤其要注意各种语法错误、逻辑错误调试经验的积累。
要注意的是,汇编语言程序的实验中,其源程序到可执行程序之间的转换过程的调试步骤一般不要求有集成环境,需要分步进行。
具体步骤如下:
1)编辑源程序(用edit或记事本或editplus或UltraEdit);
2)将源程序汇编成目标文件;
3)对目标文件进行链接,形成可执行文件(.EXE/.COM);
4)执行或调试执行可执行文件。
实验报告的主要内容:
(1)实验题目;
(2)目的要求;
(3)程序说明(如程序结构、各模块的算法和数据结构等);
(4)经调试后的程序清单;
(5)测试情况说明;
(6)分析(包含没有通过的程序的原因分析)。
实验环境(软件和硬件环境):
硬件环境:
IBM-PC及其系列机
内存256KB以上
外存:
硬盘或至少一个软驱
CPU:
80586以上
显示器:
单色或彩色显示器
键盘:
标准ASCII码键盘
软件环境:
编缉器:
EDIT.COM或其它编缉器
汇编程序:
MASM.EXE
连接程序:
LINK.EXE
调试程序:
DEBUG.EXE
实验报告的具体内容填写格式,参见《实验报告格式》的规定。
实验一上机操作和DEBUG练习
实验目的:
(1)汇编语言上机过程练习。
(2)熟悉DEBUG调试程序的命令
实验要求:
(1)按汇编上机的操作过程,将下面给出的例子用编辑程序EDIT.EXE或记事本完成编辑,用汇编程序MASM.EXE进行汇编,用连接程序LINK.EXE完成连接,最后执行该程序。
(2)学会用DEBUG调试程序的U命令查看指令,学会用D命令查看数据段内容,用R命令查看寄存器内容,用T、P、G命令执行程序并观察结果。
实验内容:
第一个汇编语言程序HELLOWORLD。
程序:
DATASEGMENT
STRINGDB‘HELLOWORLD!
$’
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAH,9
LEADX,STRING
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
实验准备:
(1)计算机设备;
(2)程序调试环境的准备(熟悉汇编语言的基本结构,汇编语言的编译、连接等过程和方法,调式环境DEBUG的基本使用方法);
(3)实验源程序准备。
实验步骤:
(1)工作环境准备(安装、复制MASM),如果已经准备好,则可以跳过此步;
(2)用EDIT.COM或其它编辑软件输入源程序代码;
(3)在DOS界面上进行汇编,有条件的也可以在集成环境下进行;
(4)对汇编结果文件(*.OBJ文件)进行连接;
(5)执行可执行文件,观察并记录执行结果信息;
(6)熟悉DEBUG的基本使用方法;
(7)编写实验报告。
实验报告:
(1)在报告中利用截图列出汇编、连接的过程,并附上文字解释。
(2)在报告中利用截图列出调试程序的过程,并附上文字解释。
实验二数据传送指令
实验目的:
1.熟悉汇编语言上机过程及DEBUG调试程序。
2.熟悉寻址方式及数据传送指令的使用。
实验内容:
编写程序完成将存放在附加段中的数组数据移动到数据段中的程序,要求分别利用直接寻址方式、寄存器间接寻址方式和相对寄存器寻址方式表示数据段和附加段中的变量。
;数据段定义
DATASEGMENT
VAR_BDB2DUP(?
);定义两个字节的字节类型数组
VAR_WDW2DUP(?
);定义两个字的字类型数据
VAR_DDD2DUP(?
);定义两个双字的双类类型数组
DATAENDS
;附加段定义
EXTRASEGMENT
VAR_BYTEDB1,2;定义两个字节的字节类型数组,两个字节内容为1和2
VAR_WORDDW1234H,5678H;定义两个字的字类型数据,两个字内容分别为1234H和5678H
VAR_DWORDDD5,6;定义两个双字的双类类型数组,两个双字内容非别为5和6
EXTRAENDS
;代码段定义
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
EXTRA
START:
;给段寄存器赋段地址
MOVAX,DATA
MOVDS,AX
MOVAX,EXTRA
MOVES,AX
;在此处利用顺序程序设计的方法编写程序完成将VAR_BYTE的内容赋给VAR_B,将VAR_WORD的内容赋给VAR_W,将VAR_DWORD的内容赋给VAR_D。
;程序退出
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
实验准备:
根据实验二要求编写程序。
实验步骤:
(1)根据要求编写代码;
(2)汇编、连接并调试,在调试环境中单步执行程序,查看运行结果;
(3)编写实验报告。
实验报告:
在报告中利用截图列出调试程序的过程,并附上文字解释。
实验三算术运算指令练习
实验目的:
练习算术运算指令的应用。
实验内容:
(1)利用教材3.19题进行单步执行,观察并记录寄存器中的CF、SF、OF和ZF等标志位的变化规律;
(2)编程实现:
Z(W*X)/(Y+6),R余数,X、Y、Z、W和R均为16位有符号数,变量数值自己设置。
实验准备:
复习顺序程序设计的基本方法和计算机进行问题求解的基本步骤。
实验步骤:
(1)完成源程序设计任务,并准备好测试用例,分析其可能的测试结果;
(2)上机运行和测试所写的程序;
(3)进行实验分析;
(4)编写实验报告。
实验报告:
在报告中给出源代码并利用截图列出调试程序的过程,并附上文字解释。
实验四串操作程序设计
实验目的:
1.掌握串操作指令。
2.利用串操作指令编程。
实验要求:
熟悉串操作指令,并能灵活应用。
实验内容:
1.编写完整程序,将数据段中的字符串STRING的内容复制到附加段中的缓冲区BUFFER中,然后将EXTRA段中的字符串输出到显示器。
程序框架如下:
DATASEGMENT
STRINGDB‘COPYUSPLEASE!
$’;字符串定义,每个字符占用一个字节。
DATAENDS
EXTRASEGMENT
BUFFERDB16DUP(?
);为BUFFER分配了16个字节的存储空间。
EXTRAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
EXTRA
START:
MOVAX,DATA
MOVDS,AX;数据段段地址送DS寄存器
MOVAX,EXTRA
MOVES,AX;附加段段地址送ES寄存器
MOVAH,4CH
INT21H;程序退出
CODEENDS
ENDSTART
2.编写完整程序,利用串比较指令比较数据段和附加段中两个字符串,如果两串相等输出Y否则输出N,利用DEBUG调试程序分析串比较指令执行后CX、SI、DI的值。
DATASEGMENT
STRINGDB‘ABCDEFG’;字符串定义,每个字符占用一个字节。
DATAENDS
EXTRASEGMENT
BUFFERDB‘ABCDGFE’;为BUFFER分配了15个字节的存储空间。
EXTRAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
EXTRA
START:
MOVAX,DATA
MOVDS,AX;数据段段地址送DS寄存器
MOVAX,EXTRA
MOVES,AX;附加段段地址送ES寄存器
MOVAH,4CH
INT21H;程序退出
CODEENDS
ENDSTART
3.编写完整程序,将附加段中的缓冲区BUFFER全部赋值为’@’,然后将字符数组BUFFER的内容输出到显示器。
EXTRASEGMENT
BUFFERDB15DUP(?
);为BUFFER分配了15个字节的存储空间。
EXTRAENDS
CODESEGMENT
ASSUMECS:
CODE,ES:
EXTRA
START:
MOVAX,EXTRA
MOVES,AX;附加段段地址送ES寄存器
MOVAH,4CH
INT21H;程序退出
CODEENDS
ENDSTART
4.编写完整程序,在附加段中的字数组中查找是否有数100,有则输出Y,否则输出N。
EXTRASEGMENT
ARRAYDW1,2,3,4,93,100,38,48
EXTRAENDS
CODESEGMENT
ASSUMECS:
CODE,ES:
EXTRA
START:
MOVAX,EXTRA
MOVES,AX;附加段段地址送ES寄存器
MOVAH,4CH
INT21H;程序退出
CODEENDS
ENDSTART
实验准备:
认真复习串处理指令和条件转移指令。
实验步骤:
(1)编写源程序。
(2)汇编、连接生成可执行文件。
(3)执行程序,观察显示结果是否正确。
(4)利用DEBUG调试程序,观察程序运行过程中寄存器、存储器和条件码标志位数值的变化。
实验报告:
1.给出四个程序的源代码。
2.汇编、连接程序生成可执行文件,并用DEBUG调试,记录每条指令执行后的结果,附上截图及文字说明。
实验五DOS调用命令练习
实验目的:
熟悉和掌握程序中的DOS功能调用基本方法,并实践常用的几种方法。
实验内容:
(任选其二)
主要实验实例:
(1)写一个程序,用二进制数形式显示所按键的ASCII码值。
(2)写一个程序,它首先接受一个字符串,然后显示其中的数字符的个数,英文字母的个数和字符串的长度。
(3)编写一个显示指定内存单元内容的程序。
要求:
允许用户按十六进制数的形式输入指定内存单元的段地址值和偏移,然后用十六进制数形式显示指定字节单元的内容。
实验准备:
DOS功能调用的用途、方法。
实验步骤:
(1)上机验证所选题目的程序设计结果,并做相应测试和分析;
(2)进行实验分析;
(3)编写实验报告。
实验报告:
(1)给出两个程序的源代码。
(2)汇编、连接程序生成可执行文件,运行程序,附上截图及文字说明。
实验六分支程序设计
实验目的:
主要掌握汇编语言分支程序设计技术。
重点掌握分支程序设计中的条件判断和准备等技巧。
实验内容:
(任选其二)
主要实验实例:
1.比较AX、BX和CX(或三个从BUFF位置连续的数据)中带符号的数据,将大者存放于AX中,小者存放于CX,中者存放于BX。
2.试编写一个将十六进制数转换为对应ASCII码的程序。
3.试编写一个统计学生成绩的程序。
分别统计分数在60分以下的,60-69段,70-79段,80-89段,90-99段和100段的人数,并分别将它们存放在RESULT开始的存储单元中。
实验准备:
汇编语言条件判断和转移指令知识,分支程序设计的基本方法。
实验步骤:
(1)完成源程序设计任务,并准备好测试用例,分析其可能的测试结果;
(2)上机运行和测试所写的程序;
(3)进行实验分析;
(4)编写实验报告。
实验报告:
(1)给出两个程序的源代码。
(2)汇编、连接程序生成可执行文件,运行程序,附上截图及文字说明。
实验七循环程序设计
实验目的:
掌握循环程序设计的基本方法。
主要掌握几种基本的循环程序设计技巧,如计数法程序设计、当循环、直到循环等程序设计技术。
实验内容:
(任选其二)
主要实验实例:
1.用多种循环方法实现1+2+3+…+20的程序(至少二种方法);
2.将寄存器AX中的二进制数用十六进制形式显示出来;
3.将内存中的数据块中(BUFF为起始地址)奇数和偶数分别存入以ADDR1和ADDR2开始的存储块中,并分别统计其中的奇、偶数,将统计结果存放在RESULT开始的两个字存储单元中;
4.不利用乘法指令实现乘法的程序;
实验准备:
汇编语言下的循环程序设计基本技术和指令系统。
循环程序设计的基本结构和问题表示方法。
实验步骤:
(1)完成源程序设计任务,并准备好测试用例,分析其可能的测试结果;
(2)上机运行和测试所写的程序;
(3)进行实验分析;
(4)编写实验报告。
实验报告:
(1)给出两个程序的源代码。
(2)汇编、连接程序生成可执行文件,运行程序,附上截图及文字说明。
实验八单模块程序设计
实验目的:
练习分支、循环程序的设计方法。
实验内容:
编写程序实现以十进制形式输入一个数保存在变量中,然后再将该变量中的数以十进制形式输出。
1.十化二程序设计
题目要求:
允许用户从键盘输入小于等于65535大于等于0的十进制数(注意用户从键盘输入的是字符串),将其转换为二进制数存放在字变量SUM中。
算法:
(1)根据用户输入的数值范围,我们可以将其视为无符号数处理;
(2)用户输入时先从高位输入;
(3)试想1234=1*1000+2*100+3*10+4=((1*10+2)*10+3)*10+4;
(4)根据上面的公式,先设定一个存放数据的变量A将其置0,可以做一个循环,每次读取键盘输入的ASCII码,判断是不是回车(或者自己设定一个表示输入结束的符号),如果不是就将其转化成为对应的二进制数,然后和10*A相加,如果是回车则结束。
流程图:
2.二化十程序设计
题目要求:
定义字变量SUM,事先在其中存入一个无符号数,将其转换成十进制数字符串在屏幕上显示。
算法:
比如SUM中存放的是123,123/10商为12,余数为3;12/10,商为1,余数为2;1/10,商为0,余数为1;因为商为0,运算结束。
把每一次得到的余数倒序排列则得到1、2、3;输出时需要将数字转换成相应的字符的ASCII码,方法是加上30H。
流程图:
实验准备:
复习分支、循环程序设计方法。
实验步骤:
(1)根据要求编写源程序;
(2)汇编、连接,运行可执行程序,观察结果;
(3)利用DEBUG调试,观察程序执行过程。
实验报告:
(1)给出两个程序的源代码。
(2)汇编、连接程序生成可执行文件,运行程序,附上截图及文字说明。
实验九子程序设计
实验目的:
熟悉和掌握汇编语言中的子程序设计技术,并应用它解决实际问题。
实验内容:
(任选其二)
主要实验实例:
1.通过寄存器传递参数的子程序设计十进制数到十六进制数的转换程序的实现(从键盘获取一个十进制数,然后把该数以十六进制的形式在屏幕上显示出来)。
2.通过地址表传递参数的子程序设计(重复以上程序)。
3.通过堆栈传递参数的子程序设计(重复以上程序)。
实验准备:
子程序的基本构成和表示方法。
子程序的基本特点和程序表达方法。
子程序的参数传递与调用、返回特点。
实验步骤:
(1)完成源程序设计任务,并准备好测试用例,分析其可能的测试结果;
(2)上机运行和测试所写的程序;
(3)进行实验分析;
(4)编写实验报告。
实验报告:
(1)给出两个程序的源代码。
(2)汇编、连接程序生成可执行文件,运行程序,附上截图及文字说明。
实验十多模块程序设计
实验目的:
练习多模块程序设计的方法。
实验内容:
编写程序实现对信息加密和解密的功能。
其中:
子模块一实现输入信息和输入密文的功能;
子模块二实现加密并显示密文的功能;
子模块三实现解密并显示明文的功能;
由主模块调用各子模块中的子程序实现:
输入信息经加密后输出密文,输入密文经解密后输出明文。
加密解密功能利用查询密码表实现。
实验准备:
复习子程序编程方法和多模块设计方法。
实验步骤:
(1)分别编写各模块;
(2)分别汇编各模块,将各模块的目标文件连接为一个可执行程序;
(3)执行程序,观察运行结果;
(4)利用DEBUG调成程序。
实验报告:
给出源程序以及程序运行截图并附加文字说明。