07082汇编语言程序设计实验指导书.docx
- 文档编号:8608007
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:31
- 大小:31.87KB
07082汇编语言程序设计实验指导书.docx
《07082汇编语言程序设计实验指导书.docx》由会员分享,可在线阅读,更多相关《07082汇编语言程序设计实验指导书.docx(31页珍藏版)》请在冰豆网上搜索。
07082汇编语言程序设计实验指导书
汇编语言上机实验指导书
一、概述
上机实验总学时为16学时,其中综合性实验为2学时。
实验共有6项暂定为8次,每次2学时。
1.实验辅导的主要内容
实验辅导的内容包括每个实验的实验目的;实验内容;对实验的算法及实验方法的必要说明;实验准备;实验步骤;实验报告要求;实验程序及参考框图。
开始的实验介绍较细,后面的实验简要介绍。
2.实验的软硬件要求
关于汇编语言程序设计的硬件要求不高,有IBM-PC/XT即可,但应有彩色显示器以便进行图形实验。
软件方面应有MASM.EXE5.0版(包括LINK.EXE),与MS-DOS版本配套的DEBUG程序和EDIT.EXE编辑软件(其它编辑软件也可以)。
3.加强实践能力的培养
实验目的不光是为了验证书本理论,更重要的是对实践能力的培养。
其中包括:
实际调试程序的能力,例如修改程序参数的能力,查看结果的能力,设置断点调试运行的能力等;
开发汇编语言应用程序的能力,例如应用有关汇编软件的能力,进行系统调用和BIOS功能调用的能力,进行模块程序设计的能力等。
对某一问题用不同的程序实现的能力,例如我们为每个实验提供了参考程序(或程序段),目的是让每个实验者参照样板程序将实验成功地实现,在掌握其方法后,自己改变程序或自己编制程序加以实现。
实验一汇编语言运行环境及方法、简单程序设计(2学时、验证性)
1.实验目的:
(1) 熟悉汇编语言运行环境和方法
(2)了解如何使用汇编语言编制程序
(3) 熟悉DEBUG有关命令的使用方法
(4) 利用DEBUG掌握有关指令的功能
(5) 利用DEBUG运行简单的程序段
2.实验内容
(1)学会输入、编辑汇编语言程序
(2)学会对汇编语言程序进行汇编、连接和运行
(3)进入和退出DEBUG程序
(4)学会DEBUG中的D命令、E命令、R命令、T命令、A命令、G命令等的使用。
对于U命令、N命令、W命令等,也应试一下。
3.实验准备
(1)仔细阅读有关汇编语言环境的内容,事先准备好使用的例子。
(2)准备好源程序清单、设计好调试步骤、测试方法、对运行结果的分析。
(3)编写一个程序:
比较2个字符串所含的字符是否相同。
若相同则显示’Match.’,否则显示’Nomatch!
’;
(1)仔细阅读有关DEBUG命令的内容,对有关命令,都要事先准备好使用的例子。
4.实验步骤
(1)在DOS提示符下,进入MASM目录。
(2)在MASM目录下启动EDIT编辑程序,输入源程序,并对其进行汇编、连接和运行。
调用edit输入、编辑源程序并保存在指定的目录中;例:
editabc.asm
用汇编程序masm对源程序汇编产生目标文件obj。
例:
masmabc
不断修改错误,直至汇编通过为止。
用连接程序link产生执行文件exe.例:
linkabc
执行程序
可直接从DOS执行程序,即在DOS环境中,输入文件名即可。
(3)详细记录每一步所用的命令,以及查看结果的方法和具体结果。
5.实验报告要求
(1)程序流程图和源程序清单。
(2)如何启动和退出EDIT程序。
(3)如何对源程序进行汇编及编辑。
(4)如何启动和退出DEBUG程序。
(5)整理每个DEBUG命令使用的方法,实际示例及执行结果。
(6)启动DEBUG后,要装入某一个.EXE文件,应通过什么方法实现?
实验二循环程序、分支程序程序设计实验(4学时、验证性)
1.实验目的:
(1)掌握循环、分支程序的设计方法
(2)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。
(3)学会针对不同的问题,选用不同的组织循环的方法。
2.实验内容
(1)编写一个程序,将内存中一组有符号的字数组按递增的序列排序,并将其中的二进制数以十六进制的形式显示在屏幕上。
(2)编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符
3.实验准备
(1)编写实验内容要求的两个程序。
(2)写出调试以上程序,即修改程序参数,检查结果的操作方法。
(3)熟悉源程序汇编、连接命令的使用方法即要回答的内容。
4.实验步骤
(1)用EDIT或其它编辑软件,编写.ASM源程序,例如HEXASC.ASM及DSPKEY.ASM。
(2)对其进行汇编及连接,产生.EXE文件。
(3)对.EXE文件进行调试运行。
a.用DEBUG调试运行,学会修改AL内容的方法。
b.对DSPKEY.EXE键入不同的字符,分别进行调试。
c.在MS-DOS下运行这两个.EXE文件。
5.实验报告要求
(1)画出两个程序的流程图,若要独立编写程序,应列出相应的程序清单。
(2)说明本实验是如何利用DEBUG进行调试的。
6.参考程序清单
(1)显示AL中两位十六进制数程序:
;DISPHEX.ASM
CODESEGMENT
ASSUMECS:
CODE
START:
MOVAL,3EH
PUSHAX
MOVDL,AL
MOVCL,4
SHRDL,CL
CMPDL,9
JBENEXT1
ADDDL,7
NEXT1:
ADDDL,30H
MOVAH,2
INT21H
POPAX;显示高位ASCII码
MOVDL,AL
ANDDL,0FH
CMPDL,9
JBENEXT2
ADDDL,7
NEXT2:
ADDDL,30H
MOVAH,2
INT21H;显示低位ASCII码
MOVAH,4CH
INT21H
CODEENDS;返回DOS
ENDSTART
(2)显示键入字符程序
;DISPKEY.ASM
CODESEGMENT
ASSUMECS:
CODE
START:
MOVAH,1
INT21H;等待键入字符,送AL
CMPAL,0DH;是否是回车符?
JZDONE;是则转DONE退出程序
CMPAL,'0'
JBNEXT
CMPAL,'9'
JACHARUP
MOVDL,AL
MOVAH,2
INT21H
JMPSTART
CHARUP:
CMPAL,41H
JBNEXT
CMPAL,5AH
JACHRDN
DISPC:
MOVDL,'c'
MOVAH,2
INT21H
NEXT:
JMPSTART
CHRDN:
CMPAL,61H
JBNEXT
CMPAL,7AH
JANEXT
JMPDISPC
DONE:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
实验三子程序设计(4学时、验证性)
一、本实验的目的在于让同学们掌握同一模块调用的方法。
1.实验目的
(1)掌握主程序与子程序之间的调用关系及调用方法。
(2)掌握子程序调用过程中近程调用与远程调用的区别。
(3)掌握通过堆栈转送参数的方法。
2.实验内容
(1)将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。
要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示.
(2)编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。
3.实验说明
(1)第一个实验程序用子程序的近程调用实现。
由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。
实验过程中可以从堆栈的内容看到两个子程序的返回地址值。
由于是近调用,地址值只包括返回地址的段内偏移量。
在每个子程序的执行中,检查CS值是不变的。
(2)第二个程序是利用远调用的方法调用子程序的。
在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。
子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。
(3)第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。
一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。
有关该方法的原理此处不再介绍。
4.实验准备
(1)预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图。
(2)熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。
5.实验步骤
(1)编辑、汇编两个源程序,生成相应的可执行文件(。
EXE)
(2)用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。
特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。
(3)检查程序执行的结果是否正确。
6.实验报告要求
(1)分析远程调用与近程调用的区别,在用DEBUG有关命令观察时,执行过程有何不同。
(2)说明用堆栈传送参数的过程及其具体方法。
(3)分析实验结果及所遇到问题,并说明解决的方法。
7.参考程序清单
(1)码型转换程序清单:
;CONV.ASN
DATASEGMENT
BUFDB0ABH,0CDH,0DEH,01H,02H,03H
DB3AH,4BH,5CH,6FH
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVCX,10
LEABX,BUF
AGAIN:
MOVAL,[BX]
CALLHEXASC
INCBX
LOOPAGAIN
MOVAH,4CH
INT21H
HEXASCPROCNEAR
PUSHAX
MOVDL,AL
PUSHCX
MOVCL,4
SHRDL,CL
POPCX
CALLDISP;显示高位HEX数
POPAX
MOVDL,AL
ANDDL,0FH
CALLDISP
RET
HEXASCENDP
DISPPROC
CMPDL,9
JBENEXT
ADDDL,7
NEXT:
ADDDL,30H
MOVAH,2
INT21H;显示
RET
DISPENDP
CODEENDS
ENDSTART
(2)统计并显示键入字符串中某字符的个数
DATASEGMENT
CHARDB'b'
BUFDB50H,?
50HDUP(?
)
CRLFDB0DH,0AH,'$'
DATAENDS
MCODESEGMENT
ASSUMECS:
MCODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEADX,BUF
MOVAH,0AH
INT21H
LEADX,CRLF
MOVAH,9
INT21H
LEASI,BUF
MOVCL,[SI+1]
MOVCH,0;CX中为字符串长度
INCSI
INCSI;SI指向串首址TABLE
MOVAL,CHAR
MOVAH,0;AX中为待查字符
PUSHSI
PUSHCX
PUSHAX;参数送堆栈
CALLFARPTRCHECK
MOVDL,CHAR
MOVAH,2
INT21H
POPAX;统计个数在AL中
MOVDL,AL
ANDDL,0FH
CMPDL,9
JBENEXT
ADDDL,7
NEXT:
ADDDL,30H
MOVAH,2
INT21H;显示统计个数
MOVAH,4CH
INT21H
MCODEENDS
SCODESEGMENT
ASSUMECS:
SCODE
CHECKPROCFAR
PUSHBP
MOVBP,SP
MOVSI,[BP+10]
MOVCX,[BP+8]
MOVAX,[BP+6]
XORAH,AH
AGAIN:
CMPAL,[SI]
JNENEXT1
INCAH
NEXT1:
INCSI
LOOPAGAIN
MOVAL,AH
MOV[BP+10],AX
POPBP
RET4
CHECKENDP
SCODEENDS
ENDSTART
二、本程序的目的在于使读者掌握模块间调用子程序的编写方法.
1.实验目的
(1) 了解多模块程序设计方法。
(2) 学会使用PUBLEC和EXTRN伪指令解决模块间的符号(如变量名,标号等)通信问题。
2. 实验内容
(1)编写一个子程序,将主程序设定的内存中字符串的小写字母转换成大写字母并显示出来.主程序用另一个模块编写。
(2)编写一个子程序,将主程序指定的字符所在的地址返回给主程序,字符串与主程序在同一个模块。
3.实验准备
(1)仔细阅读教材中有关模块间通信的方法及模块程序设计的方法。
(2)弄清伪指令PUBLIC及EXTRN的功能及用法。
4.实验步骤
(1)分别对实验1和实验2的主、子模块进行汇编,在连接时,将它们装配成一个以.EXE为扩展名的可执行文件.观察汇编及连接过程中有无错误.
(2)对.EXE文件进行调试及运行.
(3)将实验1中的原字符串改为由键盘输入,然后由子模块将源串中的小写字母转换为大写字母,并将源串与转换后的两个字串分两行显示出来(设键入字串长度小于80个字符).
5.实验报告要求
(1)对愿程序清单,画出相应的程序流程图.
(2)扼要总结多模块程序的特点和编写方法.
6.参考程序清单
(1)转换字符串小写字母为大写字母的程序清单:
EXTRNDNTOUP:
FAR
PUBLICSTRING1,STRING2
DATASEGMENT
STRING1DB'thIsisAbook','$'
STRING2DB80DUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
CALLFARPTRDNTOUP
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
;DNTOUP.SM为子模块的文件名
PUBLICDNTOUP
EXTRNSTRING1:
BYTE,STRING2:
BYTE
CODESEGMENT
DNTOUPPROCFAR
ASSUMECS:
CODE
MOVBX,0
CYCLE:
MOVAL,STRING1[BX]
CMPAL,24H;是否是STRING1结尾
JZDONE;是"$",转DONE
CMPAL,61H;是小写字母吗?
JBNEXT;不是转NEXT
CMPAL,7AH
JANEXT
SUBAL,20H;转为大写字母
NEXT:
MOVSTRING2[BX],AL
INCBX
JMPCYCLE
DONE:
MOVAL,'$'
MOVSTRING2[BX],AL;补一个$
MOVDL,0DH
MOVAH,2
INT21H
MOVDL,0AH
INT21H;显示回车换行
LEADX,STRING1
MOVAH,9
INT21H;显示源串内容
MOVDL,0AH
MOVAH,2
INT21H;回车换行
MOVDX,OFFSETSTRING2
MOVAH,9
INT21H;显示转换后的大写串
RET
DNTOUPENDP
CODEENDS
ENDDNTOUP
(2)找指定字符,并返回地址值的程序清单
;MAING.ASM为主模块程序名
EXTRNFINDC:
FAR
PUBLICSTRN
DATASEGMENT
STRNDB'LINKDISPLAYSUBROUTING$'
ADDRDW?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAH,1
INT21H
CALLFARPTRFINDC
MOVADDR,DI
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
;FINDC.ASM为子模块程序名
PUBLICFINDC
EXTRNSTRN:
BYTE
CODESEGMENT
ASSUMECS:
CODE
FINDCPROCFAR
START:
LEADI,STRN
AGAIN:
CMPBYTEPTR[DI],'$'
JZDONE
CMPAL,[DI]
JNZNEXT
DONE1:
RET
NEXT:
INCDI
JMPAGAIN
DONE:
MOVDI,0FFFFH;找不到返回0FFFFH
JMPDONE1
FINDCENDP
CODEENDS
ENDSTART
(3)如由键盘输入字符串,则可在程序1的主模块DATA段中加一行提示信息IMAGE:
IMAGE DB‘INPUTASTRINGPLEASE:
$’
然后在主模块的CALL指令前插入以下程序段
LEADX,IMAGE
MOVAH,9
INT21H
LEADX,STRING2;将键入的串存入STRING2
MOVAH,0AH
INT21H
LEASI,STRING2+2
MOVCL,STRING2+1
MOVCH,0
LEADI,STRING1
AGAIN:
MOVAL,[SI]
MOV[DI],AL
INCSI
INCDI
LOOPAGAIN
MOVBYTEPTR[DI],'$';补一个$
说明:
此处先将键入字串存入STRING2,然后再将其字串部分传送到STRING1中,当然在定义STRING2时,应为:
STRING2 DB 80,?
80DUP(?
)。
实验四 输入/输出实验(2学时综合性实验)
1. 实验目的
(1) 掌握输入输出程序设计的概念和方法。
(2) 了解PC机外围芯片8255、8259的功能。
(3)学习如何在PC机上编写具有输入输出功能的程序,包括8255、8259芯片的使用方法。
2. 实验说明
本实验要求自行编写一个键盘输入处理程序,它可以完成键盘字符的读入并进行屏幕显示,本实验要利用IBM—PC系统的硬件结构,分别使用外围芯片8255及8259。
在本例中,利用8255A的A端做数据输入,对应的端口地址为60H;利用B端口作控制端输入,端口地址为61H。
8255A的控制端口地址为63H。
本例的8259中断控制器,其IRQ1端用于键盘中断请求线。
键盘通过它可以响CPU发出中断请求。
8259的I/O端口地址为21H,可以写入中断屏蔽字,以对8个中断源是否容许中断进行控制。
在每次中断结束时,要通过I/O端口地址20H写回一个中断结束命令EOI,使8259可以清除本次中断。
因此本实验既属于输入输出实验,也属于中断实验。
有关说明将详细地附在参考程序中。
3.实验内容
利用pc机键盘,编写一个读入并显示键盘输入的演示程序。
该程序只接受常规字符(包括回车键及退格键),对特殊功能键不进行处理。
在程序中设置这些特殊功能键对应0编号即可,凡是检测到键位编号为0值时,均忽略对它们的处理。
有键按下时,送出的扫描码的D7位为0时,当键抬起时,扫描的码D7位为1,以判定键是否被按下。
4.实验准备
(1) 预习输入输出程序设计的特点和方法。
(2) 仔细阅读参考程序,弄清外围芯片接口初始化的意义和方法。
5.实验步骤
(1) 建立源文件,并通过汇编和连接,产生可执行文件。
(2) 运行程序,观察常规字符键及功能键按下时程序的反应,
6.实验报告要求
(1) 给出程序框图,包括主程序框图、中断处理程序框图。
(2)说明输入输出程序设计的特点。
(3)讨论:
将SHIFT键及右SHIFT 键也进行判别处理,它们的扫描码为42及54。
为记录SHIFT键的按动状态,可设一个标志单元KBFLAG,右SHIFT按下,KBFLAG的D0位置1,左SHIFT按下,KBFLAG的D1位置1,放下左右的SHIFT键,KBFLAG的相应恢复为0。
当程序工作时,应能显示上档键的字符。
7.参考程序清单
;KEYPRG.ASM
;当在键盘上按下或松开一个键时。
如果键盘中断是允许的(21H端口第一位=0),就会产生一个类型9的中断,
;并转入到BIOS的键盘中断处理程序,该程序从8255可编程序外围接口芯片的输入端口60H读取一个字节,这个字节的低7位
;是键的扫描码。
最高位为0或1,分别表示键是按下还是松开。
按下时取得的字节称为通码,松开时称为断码
PUBLICSCANTAB,BUFFER,BUFPT1,BUFPT2,KBFLAG
STACK1SEGMENT
DB256DUP(?
)
STACK1ENDS
DATASEGMENT
BUFFERDB16DUP(0);定义10个字节的键盘缓冲区
BUFPT1DW0;指向键盘缓冲区的起点,头取
BUFPT2DW0;指向键盘缓冲区的终点,尾存
;注意当BUFPT1=BUFPT2时,表明缓冲区空
KBFLAGDB0
PROMPTDB'---kbd_ioprogrambegin---',0DH,0AH,'$'
SCANTABDB0,0,'1234567890-=',8,0
DB'QWERTYUIOP[]',0,0
DB'ASDFGHJKL',3BH,27H,0DH
DB'ZXCVBNM,./',0
DB20H,0,0,0,0,0,0,0,0,0,0,0,0,0;由于不同键盘按键及分布各不相同,因此在调试时可能产生按键和显示有差异
DB'789-456+1230.'
EVEN
OLDIP9DW?
OLDCS9DW?
DATAENDS
EXTRNKBINT:
FAR;外部引用说明
CODESEGMENT
;主程序段
ASSUMECS:
CODE,DS:
DATA
START:
MOV
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 07082 汇编语言 程序设计 实验 指导书
![提示](https://static.bdocx.com/images/bang_tan.gif)