《汇编语言》实验指导书文档格式.docx
- 文档编号:18408474
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:25
- 大小:246.68KB
《汇编语言》实验指导书文档格式.docx
《《汇编语言》实验指导书文档格式.docx》由会员分享,可在线阅读,更多相关《《汇编语言》实验指导书文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
(2)源程序经汇编后没有错误,则产生目标程序文件,扩展名为.OBJ。
(3)若程序中使用了宏指令,则汇编程序将展开宏指令。
3.用链接程序link.exe生成可执行程序文件
经汇编以后产生的目标程序文件(.OBJ文件)并不是可执行程序文件,必须经过链接以后,才能成为可执行文件(即扩展名为.EXE)。
链接以后,便可以产生可执行程序文件(.EXE文件)。
4.程序的执行
本程序当中没有编写输出部分代码,所以在屏幕上看不到程序执行的结果。
我们可以采用调试程序DEBUG来进行检查,相关内容请参见实验二。
实验二DEBUG调试程序的应用
一、实验目的
DEBUG.EXE程序是专门为分析、研制和开发汇编语言程序而设计的一种调试工具,具有跟踪程序执行、观察中间运行结果、显示和修改寄存器或存储单元内容等多种功能。
它能使程序设计人员或用户触及到机器内部,因此可以说它是80X86CPU的心灵窗口,也是我们学习汇编语言必须掌握的调试工具。
二、实验内容
1.在DEBUG环境下建立和汇编程序
在DEBUG环境下用户可以直接建立汇编语言源程序,并可以进行编辑修改和调试。
比如,在DEBUG下编写如下程序:
MOVDL,33H;
字符3的ASCII码送DL
MOVAH,2;
使用DOS的2号功能调用
INT21H;
进入功能调用,输出‘3’
该程序运行结果是在显示器上输出一个字符‘3’。
如果要输出其它字符,请改变程序中‘33H’为相应字符的ASCII码。
其中涉及DOS和BIOS功能调用。
因为我们是在DOS的支持下运行汇编语言程序,所以一般情况下,不能轻易使用输入/输出指令直接通过端口输入/输出,而必须使用DOS内部提供的子程序完成输入/输出。
DOS功能调用就是为诸如此类的目的设置的。
DOS功能调用要求在进入INT21H调用前,首先将功能调用号送AH寄存器,并根据功能调用号准备初始数据。
也就是说INT21H的2号功能调用是输出DL寄存器中的字符。
INT20H是BIOS中断服务,这一软中断用来正常结束程序。
具体步骤如下:
进入debug调试环境后,
(1)输入程序并汇编
_A100
0B03:
0100MOVDL,33
0102MOVAH,2
0104INT2l
“0B03:
0100”类似这样的地址是系统自动提供的,不需用户输入。
至此程序已输入完毕,并汇编成机器指令。
现在用G命令运行程序如下:
(2)运行程序
_G
3
Programterminatednormally
如果现在想分析一下该程序的指令,可以用反汇编命令U作如下操作:
(3)反汇编
_U100,108
0100B233MOVDL,33
0102B402MOVAH,02
0104CD21INT21
(4)将机器指令程序送到起始地址为200H的若干单元,将输入指令复制到代码段的200单元,可进行如下操作:
_Ecs:
200B2,33,B4,02,CD,21
(5)执行机器指令程序
_G=200
三、常用DEBUG命令
DEBUG命令是在命令提示符“_”下由键盘键入的。
每条命令以单个字母的命令符开头,然后是命令的操作参数,操作参数与操作参数之间,用空格或逗号隔开,操作参数与命令符之间用空格隔开,命令的结束符是回车键(ENTER)。
命令及参数的输入可以是大小写的结合。
Crtl+Break键可中止命令的执行。
Crtl+NumLock键可暂停屏幕卷动,按任一键继续。
所用的操作数均为十六进制数,不必写H。
1.汇编命令A
格式:
(1)A<
段寄存器名>
:
<
偏移地址>
(2)A<
段地址>
(3)A<
(4)A
功能:
汇编命令是将用户输入的汇编语言指令,汇编为可执行的机器指令。
键人该命令后显示段地址和偏移地址并等待用户从键盘逐条键入汇编语言指令。
每当输入一行语句后按“ENTER”键,输入的语句有效。
若输入的语句中有错,DEBUG会显示“^Error”,要求用户重新输入,直到显示下一地址时用户直接键入回车键返回到提示符“_”。
其中
(1)用指定段寄存器内容作段地址;
(3)用CS内容作段地址;
(4)以CS:
100作地址。
以后命令中提及的各种‘地址’形式,均指
(1)、
(2)、(3)中A命令后的地址形式。
2.比较命令C
C<
源地址范围>
,<
目标地址>
其中<
范围>
是由<
起始地址>
终止地址>
指出的一片连续单元,或由<
L<
长度>
指定的。
从<
的起始地址单元起逐个与目标起始地址以后的单元顺序比较单元的内容,直至源终止地址为止。
遇有不一致时,以<
源地址>
源内容>
目标内容>
的形式显示失配单元及内容。
3.显示内存单元命令D
(1)D<
地址>
(2)D<
地址范围>
(3)D
其中
(1)以CS为段寄存器;
(3)显示CS:
100为起始地址的一片内存单元内容。
该命令将显示一片内存单元的内容,左边显示行首字节的段地址:
偏移地址,中间是以十六进制形式显示的指定范围的内存单元内容,右边是与十六进制数相对应字节的ASCII码字符,对不可见字符以‘·
’代替。
4.修改内存单元命令E
(1)E<
单元内容>
(2)E<
单元内容表>
是一个十六进制数,或是用引号’(或”)括起来的字符串;
是以逗号分隔的十六进制数,或是用’或”括起来的字符串,或者是二者的组合。
(1)将指定内容写入指定单元后显示下一地址,以代替原来内容。
可连续键入修改内容,直至新地址出现后键入回车<
ENTER>
为止;
(2)将<
逐一写入由<
开始的一片单元中,该功能可以将由指定地址开始的连续内存单元中的内容,修改为单元内容表中的内容。
例如:
_EDS:
30F8,AB,”AB”
该命令执行后,从DS:
30到DS:
33的连续4个存储单元底内容将被修改为F8H,ABH,41H,42H。
5.填充内存命令F
F<
将单元内容表中的值逐个填入指定范围,单元内容表中内容用完后重复使用。
F05BC:
200L10B2,‘XYZ’,3C
该命令将由地址05BC:
200开始的10H(16)个存储单元顺序填充“B2,58,59,5A,3C,B2,58,59,5A,3C,B2,58,59,5A,3C,B2”
6.连续执行命令G
(1)G
(2)G=<
(3)G=<
断点>
其中
(2)、(3)中的“=”是不可缺省的。
●默认程序从CS:
IP开始执行。
●程序从当前的指定偏移地址开始执行。
●从指定地址开始执行,到断点自动停止并显示当前所有寄存器、状态标志位的内容和下一条要执行的指令。
DEBUG调试程序最多允许设置10个断点。
7.跟踪命令T
T[=<
][<
条数>
]
如果键入T命令后直接按“ENTER”键,则默认从CS:
IP开始执行程序,且每执行一条指令后要停下来,显示所有寄存器、状态标志位的内容和下一条要执行的指令。
用户也可以指定程序开始执行的起始地址。
的缺省值是一条,也可以由<
指定执行若干条命令后停下来。
T
该命令执行当前指令并显示所有寄存器、状态标志位的内容和下一条要执行的指令。
又例如:
T10
该命令从当前指令开始执行10H条指令后停下来,所有寄存器、状态标志位的内容和下一条要执行的指令。
8.反汇编命令U
(1)U<
(2)U<
反汇编命令是将机器指令翻译成符号形式的汇编语言指令。
该命令将指定范围内的代码以汇编语句形式显示,同时显示地址及代码。
注意,反汇编时一定确认指令的起始地址后再作,否则将得不到正确结果。
地址及范围的缺省值是上次U指令后下一地址的值。
这样可以连续反汇编。
9.执行过程命令P
P
执行一条指令或一个过程(子程序),然后显示各寄存器的状态。
说明:
该命令主要用于调试程序。
它与跟踪命令T的作用类似,T命令是跟踪一条或多条指令,而P命令是执行一条指令(包括带重复前缀的数据串操作指令)或一个完整的过程(子程序)。
设有如下指令序列
:
MOVAH,02H
当要执行INT21H这条指令时,若用T命令进行跟踪,则进入INT21H程序(DOS功能调用)后,需要数十次T命令才能返回当前程序;
若采用P命令进行调试,则只执行INT21H一条指令,执行完立即返回,给调试者的感觉好象是执行了一条普通指令一样。
因此,当读者以后遇到CALL、INTn指令或带重复前缀的数据串操作指令时,若不想观察相应过程的详细执行过程,就可以用P命令。
10.显示命令R
(1)R
(2)R<
寄存器名>
显示当前所有寄存器内容、状态标志及将要执行的下一指令的地址(即CS:
IP)、机器指令代码及汇编语句形式。
其中对状态标志寄存器FLAG以状态标志位的形式显示,详见表2-1。
表2-1状态标志显示形式
状态标志位
状态
显示形式
溢出标志OF
有/无
OV/NV
方向标志DF
减/增
DN/UP
中断标志IF
开/关
EI/DI
符号标志SF
负/正
NG/PL
零标志ZF
零/非零
ZR/NZ
奇偶标志PF
偶/奇
PE/PO
进位标志CF
CY/NC
辅助进位标志AF
AC/NA
键入该命令后将显示指定寄存器名及其内容,“:
”后可以键入修改内容。
键入修改内容后按“ENTER”键有效。
若不需修改原来内容,直接按“ENTER”即可。
RAX
11.结束DEBUG返回DOS命令Q
Q
返回DOS提示符下。
四、重新调试实验一的程序,看最终AX寄存器的值是多少?
实验三简单算术运算程序设计
1.掌握数据传送和算术运算指令的用法。
2.熟悉在PC机上建立、汇编、连接和调试程序的方法。
3.理解计算机中除法溢出的含义。
1.设W、X、Y、Z均为8位带符号数,要求完成计算表达式W=X+Y-Z。
编程思路(仅供参考):
该题目要求掌握运算中带符号数和无符号数运算的区别。
本题目只考虑有符号数情况
参考程序清单:
ABC.ASM
DATASEGMENT
XDB1;
x单元存放数字1,以下类推
YDB4
ZDB3
WDB?
?
预留2个单元,存放运算结果
DATAENDS
CODESEGMENT
CODE,DS:
DATA
MOVAX,DATA
MOVDS,AX
==========================
MOVAL,X
ADDAL,Y;
x+y
SUBAL,Z;
x+y-z
MOVW,AL存结果到W单元
==========================输出结果
MOVAH,2;
调用DOS中断INT21H功能的2号子功能
ADDAL,30h;
个位数字变成数字字符,
Movdl,al
INT21H;
此3条语句输出数字的ASCII码
INT21H
CODEENDS
思考:
1.如果运算结果大于等于10,显示的结果正确吗?
如何解决?
2.如果运算结果小于0,显示的结果正确吗?
实验四汇编语言的输入输出
1.掌握数据传送和算术运算指令的用法。
2.熟悉字符的输入输出。
改写实验三ABC.ASM,分以下6个问题进行编程
1.改写实验三ABC.ASM,把其中的X,Y,Z都置空,代码如下
XDB?
YDB?
ZDB?
2.改为从键盘输入X,Y,Z的值,分别为1,4,3,输入单个字符的代码为:
MOVAH,1
INT21H
调用INT21H中的1号功能,输入单个字符,输入的字符的ASCII码值存放在AL寄存器中,分3次输入,然后再进行加、减运算,看看运算结果是否正确?
如果不正确,如何解决?
3.如果想让输入和输出的结果如下图所示,又该如何解决?
4.如果想让输入和输出的结果如下图所示,又该如何解决?
5.在此基础上,把ABC.ASM程序改为下面的表达式,写出代码:
W=((X+Y)*2-Z)/2;
X,Y,Z,W均为8位数值
6.如果X,Y,Z,W均为16位数值,那么如何编写下面的表达式的代码?
W=((X*Y)+5-Z*5)/2
实验五分支结构程序设计
一、实验目的
1.掌握分支程序的结构及相关指令。
2.掌握分支程序的设计,调试方法。
1.在BUF和BUF+1、BUF+2单元分别放有一个无符号字节型数,编程序将其中最大数存入MAX单元,并在屏幕上显示(要求画出流程图)。
2.要求同上,只是比较的数为有符号数。
3.将1000H单元开始的10个字节数,采用奇偶校验,将奇数在前偶数在后仍存回原数据区。
本实验要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。
4.大写字母转换成小写字母程序按ESC键结束
算法分析:
由ASCII码字符表可知,英文大、小写的26个字母的值的差为20H,因此欲将从键盘上输入的大写字母转换为相应的小写字母,只需将从键盘输入的大写字母的ASCII编码值加上20H即可。
5.已知两整数变量A和B,试编制完成下列功能的程序:
①若两数中一个是奇数,则将奇数送入A—BUF单元中,偶数送入B—BUF单元中。
②若两个数均为奇数,则两数分别加1,并存入原变量中。
③若两个数均为偶数,则两变量不变。
设义、B两变量预先存放在数据段的A—BUF和B—BUF的字节单元中,其值分别为X和Y。
解答这个题目的关键是如何判断一个数是奇数或是偶数,这只要判断一个数的最低位是0或是1就可以了。
若是0,则为偶数,若为1,则为奇数,可以采用TEST指令和条件转移指令JZ来实现,
6.在内存中以BUF单元开始缓冲区中连续存放着10个学生的分数,试编制程序统计其中90一100分、80一89分、60一79分及60分以下者各有多少人,并把结果分别存放在S9、S8、S7和S6中。
7.试编制程序,从键盘输入学生成绩(A、B、C、D),自动汇总并显示各类分数的人数(假定各类分数的总人数在0一9之间)。
若按下$键,则停止输入;
若按下A、B、C、D之外的其他键,则提示“INPUTERR0R”信息。
8.应用跳转表法完成下面要求的多路分支程序的设计:
根据从键盘输入的参数值0一7,分别转向标号为10—17的程序段中,10—17程序段分别实现显示字符0一70。
9. 统计一个有10人的班中,男、女生的人数各是多少。
将统计的男生人数存入变量MANK中,女生人数存入变量WOMAN中。
男、女生的标志可用“0”、“1”字符来表示,并从键盘输入此标志。
根据题意,总人数已知,在此范围下,对输入标志进行分类求和显然可用循环结构来完成。
每循环一次使相应人数增1,而循环计数值减1,直至该计数值为0。
可用CX作为循环计数值,用LOOP指令对循环条件进行判定。
10.编程,要求:
(1)用9号功能显示一串字符,如”INPUTYOURNAME:
”
(2)在串的尾部输入你的英文名字,至少3个字符,按回车键后,(3)在下一行,重新显示你输入的名字,(4)名字后面,继续显示串“(y/n)?
”(5)输入为字母”y”结束程序,输入字母”n”回到
(1)重新输入。
实验六循环结构程序设计
1.掌握循环结构程序设计的方法;
2.掌握数据块传送程序设计的方法;
3.掌握循环指令的应用。
1.编写程序实现将数据段STR1单元开始的20个字符移到STR2开始的存储区。
假设STR1+20>
STR2,可以用串传送指令,也可以用MOV传送指令。
编程思路:
该题目要求掌握单循环程序设计方法。
为了实现指定功能,应从以下几个方面考虑:
(1)数据串操作的起始位置从高地址还是从低地址开始。
(2)确定使用串传送指令,还是用MOV指令。
(1)确定循环程序的结构。
2.编制程序计算S=1+2+3+4+……+N直到和大于500为止,并将结果由屏幕上显示出来(N的值和最终的和的值)。
其程序的逻辑框图如图3.1所示,
3.3000H内存单元开始的100个字节存储单元全部清0。
本实验要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。
4.编程:
输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数,并显示各种统计结果。
5.动态从键盘输入20个二位无符号数,找出其中最大数并显示。
6.动态从键盘输入20个二位无符号数,从小到大排序并显示。
7.设数据区有两个字节串,串1的长度为5,串2的长度为10。
编程:
若串2的最后5个字符和串1相同,则置FLAG单元为“Y”,否则置为“N”。
8.编写打印如下图形程序
10
210
3210
43210
543210
6543210
76543210
876543210
9876543210
实验七子程序设计
1.掌握子程序的定义和调用及参数传递的方法。
2.掌握子程序、子程序的嵌套、递归子程序的结构。
3.掌握子程序的设计、编制及调试。
1.对缓冲区中的一组字符的ASCII码加偶校验。
要求画出流程图,编写程序。
每个字符的ASCII码为7位,占一个字节,其最高位为校验位。
偶校验的含义为:
校验位与7位字符位中的1的个数之和为偶数,这可用于字符正确与否的校验。
字符为1011011,其中1的个数为5,那么校验位填1,这样1的个数为6,即为偶校验。
偶校验位的填入可作为子程序来设计,缓冲区的首址一般由主程序提供,可假设缓冲区中的字符个数由缓冲区中的第一个字节给出。
2.用子程序调用实现在屏幕上显示10行相同的字符,要求显示字符串功能用子程序调用方法实现。
3.试编制计算N!
(N≥0)的程序。
N!
=N*(N-1)*(N-2)*……*1,其递归定义如下:
0!
=1,
N!
=N*(N-1)!
(N>1)
4.用子程序结构编写程序:
从键盘输入一个二位十进制数的月份数(01~12),然后显示相应的英文缩写名。
5.编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及8个字符的电话号码,并以一定的格式显示出来。
具体要求:
主程序TELIST中包括以下功能
(1)显示提示符INPUT_NAME:
(2)调用子程序INPUT_NAME输入姓名;
(3)显示提示符INPUTTELEPHONENUMBER:
(4)调用子程序Input_PHONE输入电话号码;
(5)调用子程序PRINTLINE显示姓名及电话号码。
子程序INPUT_NAME中包括以下功能
(1)调用键盘输入子程序GETCHAR,把输入的姓名存放在INBUF缓冲区;
(2)把INBUF中的姓名移入输出行OUTNAME。
子程序Input_PHONE中包括以下功能
(1)调用键盘输入子程序GETCHAR,把输入的8位号码存放在INBUF缓冲区;
(2)把INBUF中的号码移入输出行OUTPHONE。
子程序PRINTLINE中以下功能
显示姓名及电话号码,格式为:
NAMETEL
XXX XXX
实验八显示程序设计
1.掌握软件延时程序的编写方法。
2.熟悉系统功能调用的方法。
3.掌握宏定义与宏调用的方法。
1.编写在屏幕上每隔一秒连续显示字符0-9的程序。
编程提示:
为了使输出的字符之间有空格,在每一个循环中输出一个0-9的字符和一个空格。
为了输出0-9,置寄存器BL初值为0,每循环一次使其增量。
为了保证输出是十进制,增量后用DAA调整指令。
由于输出为一位十进制数,用AND0FH指令屏蔽高4位。
2.用系统功能调用将‘HELLO’由键盘输入,再从屏幕输出‘**HELLO**’。
3.编程实现:
每隔5.5S从键盘读一个字符,并将字符的ASCII码存入缓冲区,共读50个字符,利用INT16H的0功能读取字符,返回值在AL中。
4.利用自编中断INT60H实现在屏幕上显示10行相同字符。
显示功能用INT60H实现。
实验九 综合实验
一、实验题目:
显示学生名次表
二、实验目的:
进行汇编语言程序设计应用的综合性训练。
综合运用汇编语言循环程序和子程序编程方法,巩固提高汇编语言程序设计能力应用水平。
三、实验内容
实验内容:
编制一程序,要求接收从键盘输入的一个班的学生的学号、姓名、成绩,对学生的成绩进行排序,最
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 实验 指导书
![提示](https://static.bdocx.com/images/bang_tan.gif)