8086汇编语言程序设计实验指导书Word格式文档下载.docx
《8086汇编语言程序设计实验指导书Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《8086汇编语言程序设计实验指导书Word格式文档下载.docx(33页珍藏版)》请在冰豆网上搜索。
’;
(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)掌握循环、分支程序的设计方法
(2)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。
(3)学会针对不同的问题,选用不同的组织循环的方法。
(1)编写一个程序S21,将内存中一组有符号的字数组按递增的序列排序,并将其中的二进制数以十六进制的形式显示在屏幕上。
(2)编写一个程序S22,判别键盘上输入的字符;
若是1-9字符,则显示之;
若为A-Z或a-z字符,均显示“c”;
若是回车字符<
CR>
(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。
(1)编写实验内容要求的两个程序。
(2)写出调试以上程序,即修改程序参数,检查结果的操作方法。
(3)熟悉源程序汇编、连接命令的使用方法即要回答的内容。
(1)用EDIT或其它编辑软件,编写.ASM源程序,例如S21.ASM及S22.ASM。
(2)对其进行汇编及连接,产生.EXE文件。
(3)对.EXE文件进行调试运行。
a.用DEBUG调试运行,学会修改AL内容的方法。
b.对DSPKEY.EXE键入不同的字符,分别进行调试。
c.在MS-DOS下运行这两个.EXE文件。
(1)画出两个程序的流程图,若要独立编写程序,应列出相应的程序清单。
(2)说明本实验是如何利用DEBUG进行调试的。
实验三子程序设计(4学时、验证性)
实验3.1、本实验的目的在于让同学们掌握同一模块调用的方法。
1.实验目的
(1)掌握主程序与子程序之间的调用关系及调用方法。
(2)掌握子程序调用过程中近程调用与远程调用的区别。
(3)掌握通过堆栈转送参数的方法。
2.实验内容
(1)编写程序S31,将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。
要求码型转换通过子程序HEXASC实现,在转换过程中,通过子程序DISP实现显示.
(2)编写一个主程序S32,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’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)分析实验结果及所遇到问题,并说明解决的方法。
实验3.2、本程序的目的在于使读者掌握模块间调用子程序的编写方法.
1.实验目的
了解多模块程序设计方法。
(2)
学会使用PUBLEC和EXTRN伪指令解决模块间的符号(如变量名,标号等)通信问题。
2.
实验内容
(1)编写一个子程序,将主程序设定的内存中字符串的小写字母转换成大写字母并显示出来.主程序S33用另一个模块编写。
(2)编写一个子程序,将主程序S34指定的字符所在的地址返回给主程序,字符串(字符串以$为结束标志)与主程序在同一个模块。
(1)仔细阅读教材中有关模块间通信的方法及模块程序设计的方法。
(2)弄清伪指令PUBLIC及EXTRN的功能及用法。
(1)分别对实验1和实验2的主、子模块进行汇编,在连接时,将它们装配成一个以.EXE为扩展名的可执行文件.观察汇编及连接过程中有无错误.
(2)对.EXE文件进行调试及运行.
(3)将实验1中的原字符串改为由键盘输入,然后由子模块将源串中的小写字母转换为大写字母,并将源串与转换后的两个字串分两行显示出来(设键入字串长度小于80个字符).
(1)画出相应的程序流程图。
(2)扼要总结多模块程序的特点和编写方法。
实验四
输入/输出实验(2学时综合性实验)
1.
实验目的
掌握输入输出程序设计的概念和方法。
了解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,以判定键是否被按下。
预习输入输出程序设计的特点和方法。
仔细阅读参考程序,弄清外围芯片接口初始化的意义和方法。
建立源文件,并通过汇编和连接,产生可执行文件。
运行程序,观察常规字符键及功能键按下时程序的反应,
6.实验报告要求
给出程序框图,包括主程序框图、中断处理程序框图。
(2)说明输入输出程序设计的特点。
(3)讨论:
将SHIFT键及右SHIFT
键也进行判别处理,它们的扫描码为42及54。
为记录SHIFT键的按动状态,可设一个标志单元KBFLAG,右SHIFT按下,KBFLAG的D0位置1,左SHIFT按下,KBFLAG的D1位置1,放下左右的SHIFT键,KBFLAG的相应恢复为0。
当程序工作时,应能显示上档键的字符。
实验五字符处理程序实验
1.实验目的
(1)熟悉串操作指令的功能与应用
(2)掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序。
(1)字符串统计。
自STRN开始的存储区中,有一个字符串,统计其中含有小写字母的个数,将统计结果以两位十进制数显示在屏幕上。
(2)在给定的字符串中,删除重复的字符,其余的字符向前递补。
3.实验准备
(1)熟悉字符处理的方法和字符处理程序的设计;
(2)认真预习有关串操作的指令极其寻址方式的特点,能够正确使用串操作指令,并准备好数据。
(3)按正常的方法将删除字符程序编成子程序,规定子程序的入口和出口参数。
4.实验步骤
(1)用1号系统调用从键盘键入一个字符串,然后统计其中小写字母的个数。
程序每次执行,都能得到不同的结果。
(2)编写一个在同一个字符串中删除字符,并将其余字符向前递补的程序。
5.实验报告要求
(1)对照参考程序,画出程序流程图。
(2)总结字符串处理的编程方法,提出改进和完善此类程序的设计方案。
实验六BIOS和DOS中断调用应用程序设计
1.
实验目的
(1)了解DOS、BIOS调用的基本功能、调用参数、返回参数。
以及数据定义
掌握中断通信程序的设计方法。
(2)掌握如何利用扫描码进行功能控制。
编写一个可以进行光标左右移动和插入字符的简单字处理程序。
复习相关内容
(2)了解键盘的扫描码、ASCII码及其显示字符(如果存在可显示字符形式)之间的对应关系。
4.实验步骤
建立源文件,汇编、连接产生可执行文件。
运行程序,使得可以输入字符和光标左右移动及字符的插入。
5.
实验报告要求
由参考程序,画出简单字处理程序框图。
讨论如何实现光标的上下移动和字符的删除。
源程序清单
实验2
;
S21.ASM
DSEGSEGMENT
XDW234H,32FH,90DH,123EH,-78EH,0ACFH,-234H,98H,-23DFH
COUNTDW9
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
MAINPROCFAR
START:
PUSHDS
XORAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX
MOVCX,COUNT
LAB0:
MOVBX,1
DECCX
JZLAB3
PUSHCX
LEADI,X
LAB1:
MOVAX,[DI]
CMPAX,[DI+2]
JLELAB2
XORBX,BX
XCHGAX,[DI+2]
MOV[DI],AX
LAB2:
ADDDI,2
LOOPLAB1
POPCX
CMPBX,0
JZLAB0
LAB3:
LAB4:
MOVCH,4
MOVBX,[DI]
LAB5:
MOVCL,4
ROLBX,CL
MOVDL,BL
ANDDL,0FH
CMPDL,9
JBELAB6
ADDDL,7
LAB6:
ADDDL,30H
MOVAH,2
INT21H
DECCH
JNZLAB5
MOVDL,20H
LOOPLAB4
MOVDL,0DH
MOVDL,0AH
LEADI,X
LAB7:
MOVCX,16
LAB8:
XORDL,DL
ROLBX,1
RCLDL,1
LOOPLAB8
MOVDL,'
B'
'
LOOPLAB7
RET
MAINENDP
CSEGENDS
ENDSTART
其中斜体字部分为以二进制输出。
S22.ASM
CODESEGMENT
CODE
START:
MOVAH,1
INT21H;
等待键入字符,送AL
CMPAL,0DH;
是否是回车符?
JZDONE;
是则转DONE退出程序
CMPAL,'
0'
JBNEXT
9'
JACHARUP
MOVDL,AL
MOVAH,2
INT21H
JMPSTART
CHARUP:
CMPAL,41H
CMPAL,5AH
JACHRDN
DISPC:
MOVDL,'
c'
INT21H
NEXT:
CHRDN:
CMPAL,61H
CMPAL,7AH
JANEXT
JMPDISPC
DONE:
MOVAH,4CH
CODEENDS
ENDSTART
实验3.1
(1)编写程序S31,将BUF开始的10个字节单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。
要求码型转换通过子程序HEXASC实现,在转换过程中,通过子程序DISP实现显示。
S31.ASM
DATASEGMENT
BUFDB0ABH,0CDH,0DEH,01H,02H,03H
DB3AH,4BH,5CH,6FH
DATAENDS
CODE,DS:
DATA
MOVAX,DATA
MOVDS,AX
MOVCX,10
LEABX,BUF
AGAIN:
MOVAL,[BX]
CALLHEXASC
INCBX
LOOPAGAIN
MOVAH,4CH
HEXASCPROCNEAR
PUSHAX
MOVDL,AL
PUSHCX
MOVCL,4
SHRDL,CL
POPCX
CALLDISP;
显示高位HEX数
POPAX
ANDDL,0FH
CALLDISP
RET
HEXASCENDP
DISPPROC
CMPDL,9
JBENEXT
ADDDL,7
ADDDL,30H
MOVAH,2
INT21H;
显示
DISPENDP
DATASEGMENT
CHARDB'
b'
BUFDB50H,?
50HDUP(?
)
CRLFDB0DH,0AH,'
$'
DATAENDS
MCODESEGMENT
MCODE,DS:
LEADX,BUF
MOVAH,0AH
LEADX,CRLF
MOVAH,9
LEASI,BUF
MOVCL,[SI+1]
MOVCH,0;
CX中为字符串长度
INCSI
INCSI;
SI指向串首址TABLE
MOVAL,CHAR
MOVAH,0;
AX中为待查字符
PUSHSI
PUSHAX;
参数送堆栈
CALLFARPTRCHECK
MOVDL,CHAR
INT21H
POPAX;
统计个数在AL中,个数不能超过一位16进制数
ANDDL,0FH
CMPDL,9
JBENEXT
ADDDL,7
ADDDL,30H
INT21H;
显示统计个数
MCODEENDS
SCODESEGMENT
SCODE
CHECKPROCFAR
PUSHBP
MOVBP,SP
MOVSI,[BP+10]
MOVCX,[BP+8]
MOVAX,[BP+6]
XORAH,AH
CMPAL,[SI]
JNENEXT1
INCAH
NEXT1:
INCSI
MOVAL,AH
MOV[BP+10],AX
POPBP
RET4
CHECKENDP
SCODEENDS
实验3.2
EXTRNDNTOUP:
FAR
PUBLICSTRING1,STRING2
STRING1DB'
thIsisAbook'
'
STRING2DB80DUP(?
MOVDS,AX
CALLFARPTRDNTOUP
MOVAH,4CH
DNTOUP.SM为子模块的文件名
PUBLICDNTOUP
EXTRNSTRING1:
BYTE,STRING2:
BYTE
DNTOUPPROCFAR
MOVBX,0
CYCLE:
MOVAL,STRING1[BX]
CMPAL,24H;
是否是STRING1结尾
是"
$"
转DONE
CMPAL,61H;
是小写字母吗?
JBNEXT;
不是转NEXT
CMPAL,7AH
SUBAL,20H;
转为大写字母
MOVSTRING2[BX],AL
INCBX
JMPCYCLE
MOVAL,'
MOVSTRING2[BX],