《8086(汇编)语言程序设计实验指导书.docx》由会员分享,可在线阅读,更多相关《8086(汇编)语言程序设计实验指导书.docx(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、word 完善格式汇编语言上机试验指导书一、概述上机试验总学时为 16 学时,其中综合性试验为 2 学时。试验共有 6 项暂定为 8 次,每次 2 学时。1.试验辅导的主要内容试验辅导的内容包括每个试验的试验目的;试验内容;对试验的算法及试验方法的必要说明;试验预备;试验步骤;试验报告要求;试验程序及参考框图。开头的试验介绍较细,后面的试验简要介绍。2.试验的软硬件要求关于汇编语言程序设计的硬件要求不高,有IBM-PC/XT 即可,但应有彩色显示器以便进展图形试验。软件方面应有MASM.EXE5.0版包括 LINK.EXE,与 MS-DOS 版本配套的 DEBUG 程序和 EDIT.EXE 编
2、辑软件其它编辑软件也可以。3.加强实践力气的培育试验目的不光是为了验证书本理论,更重要的是对实践力气的培育。其中包括:实际调试程序的力气,例如修改程序参数的力气,查看结果的力气,设置断点调试运行的力气等;开发汇编语言应用程序的力气,例如应用有关汇编软件的力气,进展系统调用和 BIOS 功能调用的力气,进展模块程序设计的力气等。对某一问题用不同的程序实现的力气,例如我们为每个试验供给了参考程序或程序段,目的是让每个试验者参照样板程序将试验成功地实现,在把握其方法后,自己转变程序或自己编制程序加以实现。试验一 汇编语言运行环境及方法、简洁程序设计(2 学时、验证性) 1.试验目的:(1) 生疏汇编
3、语言运行环境和方法(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) 预备好源程序清单、设计好调试步骤、测试方法、对运行结果的分析
4、。(3) 编写一个程序:比较 2 个字符串所含的字符是否一样。假设一样则显示Match.,否则显示No match!;(1)认真阅读有关DEBUG 命令的内容,对有关命令,都要事先预备好使用的例子。4.试验步骤(1) 在 DOS 提示符下,进入 MASM 名目。(2) 在 MASM 名目下启动 EDIT 编辑程序,输入源程序,并对其进展汇编、连接和运行。调用 edit 输入、编辑源程序并保存在指定的名目中;例:edit abc.asm用汇编程序 masm 对源程序汇编产生目标文件 obj。例:masm abc不断修改错误,直至汇编通过为止。用连接程序 link 产生执行文件 exe.例:lin
5、k abc执行程序可直接从 DOS 执行程序,即在 DOS 环境中,输入文件名即可。(3) 具体记录每一步所用的命令,以及查看结果的方法和具体结果。5.试验报告要求(1) 源程序清单。(2) 如何启动和退出 EDIT 程序。(3) 如何对源程序进展汇编及编辑。(4) 如何启动和退出 DEBUG 程序。学习帮手(5) 整理每个 DEBUG 命令使用的方法,实际例如及执行结果。(6) 启动 DEBUG 后,要装入某一个.EXE 文件,应通过什么方法实现? 试验二 循环程序、分支程序程序设计试验(4 学时、验证性)1. 试验目的:(1) 把握循环、分支程序的设计方法(2) 进一步生疏利用 DEBUG
6、 程序修改参数的方法,并检查和验证结果的正确性。(3)学会针对不同的问题,选用不同的组织循环的方法。2. 试验内容(1)编写一个程序 S21,将内存中一组有符号的字数组按递增的序列排序,并将其中的二进制数以十六进制的形式显示在屏幕上。(2)编写一个程序 S22,判别键盘上输入的字符;假设是 1-9 字符,则显示之;假设为 A-Z 或 a-z 字符,均显示“c”;假设是回车字符(其 ASCII 码为 0DH),则完毕程序,假设为其它字符则不显示,连续等待的字符输入。3. 试验预备(1) 编写试验内容要求的两个程序。(2) 写出调试以上程序,即修改程序参数,检查结果的操作方法。(3)生疏源程序汇编
7、、连接命令的使用方法即要答复的内容。4. 试验步骤(1)用 EDIT 或其它编辑软件,编写.ASM 源程序,例如 S21.ASM 及 S22.ASM。(2)对其进展汇编及连接,产生.EXE 文件。(3)对.EXE 文件进展调试运行。a. 用 DEBUG 调试运行,学会修改 AL 内容的方法。b. 对 DSPKEY.EXE 键入不同的字符,分别进展调试。c. 在 MS-DOS 下运行这两个.EXE 文件。5. 试验报告要求(1)画出两个程序的流程图,假设要独立编写程序,应列出相应的程序清单。(2)说明本试验是如何利用 DEBUG 进展调试的。试验三 子程序设计(4 学时、验证性)试验 3.1、本
8、试验的目的在于让同学们把握同一模块调用的方法。1.试验目的(1)把握主程序与子程序之间的调用关系及调用方法。(2)把握子程序调用过程中近程调用与远程调用的区分。(3)把握通过堆栈转送参数的方法。2. 试验内容(1) 编写程序 S31,将 BUF 开头的 10 个单元中的二进制数转换成两位十六进制数的 ASCII 码,在屏幕上显示出来。要求码型转换通过子程序 HEXASC 实现,在转换过程中,通过子程序 DISP 实现显示.(2) 编写一个主程序S32,从键盘接收假设干个字符,然后用远调用的方法,调用子程序统计字符串中字符b的个数.子程序的参数是字符串的首地址 TABLE,字符串长度 N 及字符
9、”b”.子程序返回字符b”的个数.参数传送承受堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。3. 试验说明(1) 第一个试验程序用子程序的近程调用实现。由于在调用 HEXASC 子程序时,子程序又调用了 DISP 子程序,这叫子程序的嵌套调用。试验过程中可以从堆栈的内容看到两个子程序的返回地址值。由于是近调用,地址值只包括返回地址的段内偏移量。在每个子程序的执行中,检查 CS 值是不变的。(2) 其次个程序是利用远调用的方法调用子程序的。在远调用状况下,主程序与子程序处在不同的规律代码段中,可在子程序执行中查看 CS 值,它与主程序中的 CS 值是不同的。子程序
10、调用后,堆栈中保存了返回地址的段地址及段内偏移量。(3) 其次个程序中,主程序与子程序之间参数的传送是由堆栈实现的。一段是将参数此处是串首址 TABLE,串的长度 N 及待统计的字符“b”挨次压如堆栈,在子程序调用后,通过 BP 指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。有关该方法的原理此处不再介绍。4. 试验预备(1) 预习子程序设计的根本方法,依据试验内容要求,画出子程序及主程序的流程图。(2) 生疏键盘键入字符串及用堆栈传送参数的程序段编制方法。5试验步骤(1) 编辑、汇编两个源程序,生成相应的可执行文件.EXE(2) 用 DEBUG 的 R 命令,T 命令或 G 命令和 D
11、命令检查远程调用及近程调用时堆栈的变化。特别是通过堆栈传送的参数和子程序取出的参数是返回参数的具体过程。(3) 检查程序执行的结果是否正确。6试验报告要求(1)分析远程调用与近程调用的区分,在用 DEBUG 有关命令观看时,执行过程有何不同。(2)说明用堆栈传送参数的过程及其具体方法。(3)分析试验结果及所遇到问题,并说明解决的方法。试验 3.2、本程序的目的在于使读者把握模块间调用子程序的编写方法. 1.试验目的(1) 了解多模块程序设计方法。(2) 学会使用 PUBLEC 和 EXTRN 伪指令解决模块间的符号(如变量名,标号等)通信问题。2. 试验内容(1) 编写一个子程序,将主程序设定
12、的内存中字符串的小写字母转换成大写字母并显示出来.主程序 S33 用另一个模块编写。(2) 编写一个子程序,将主程序 S34 指定的字符所在的地址返回给主程序,字符串(字符串以$为完毕标志)与主程序在同一个模块。3. 试验预备(1)认真阅读教材中有关模块间通信的方法及模块程序设计的方法。(2)弄清伪指令 PUBLIC 及 EXTRN 的功能及用法。4. 试验步骤(1) 分别对试验 1 和试验 2 的主、子模块进展汇编,在连接时,将它们装配成一个以 .EXE 为扩展名的可执行文件.观看汇编及连接过程中有无错误.(2) 对.EXE 文件进展调试及运行.(3) 将试验 1 中的原字符串改为由键盘输入
13、,然后由子模块将源串中的小写字母转换为大写字母,并将源串与转换后的两个字串分两行显示出来(设键入字串长度小于 80 个字符). 5.试验报告要求(1) 画出相应的程序流程图。(2) 扼要总结多模块程序的特点和编写方法。试验四输入/输出试验2 学时 综合性试验1. 试验目的(1) 把握输入输出程序设计的概念和方法。(2) 了解 PC 机外围芯片 8255、8259 的功能。(3) 学习如何在 PC 机上编写具有输入输出功能的程序,包括 8255、8259 芯片的使用方法。2. 试验说明本试验要求自行编写一个键盘输入处理程序,它可以完成键盘字符的读入并进展屏幕显示,本试验要利用 IBMPC 系统的
14、硬件构造,分别使用外围芯片 8255 及 8259。在本例中,利用 8255A 的 A 端做数据输入,对应的端口地址为 60H;利用 B 端口作把握端输入,端口地址为 61H。8255A 的把握端口地址为 63H 。本例的 8259 中断把握器,其 IRQ1 端用于键盘中断恳求线。键盘通过它可以响 CPU 发出中断恳求。8259 的 I/O 端口地址为 21H,可以写入中断屏蔽字,以对 8 个中断源是否容许中断进展把握。在每次中断完毕时,要通过I/O 端口地址 20H 写回一个中断完毕命令 EOI ,使 8259 可以去除本次中断。因此本试验既属于输入输出试验,也属于中断试验。有关说明将具体地
15、附在参考程序中。3. 试验内容利用 pc 机键盘,编写一个读入并显示键盘输入的演示程序。该程序只承受常规字符包括回车键及退格键,对特别功能键不进展处理。在程序中设置这些特别功能键对应 0 编号即可,但凡检测到键位编号为 0 值时,均无视对它们的处理。有键按下时,送出的扫描码的 D7 位为 0 时,当键抬起时,扫描的码 D7 位为 1,以判定键是否被按下。4. 试验预备(1) 预习输入输出程序设计的特点和方法。(2) 认真阅读参考程序,弄清外围芯片接口初始化的意义和方法。5. 试验步骤(1) 建立源文件,并通过汇编和连接,产生可执行文件。(2) 运行程序,观看常规字符键及功能键按下时程序的反响,
16、6. 试验报告要求(1) 给出程序框图,包括主程序框图、中断处理程序框图。(2) 说明输入输出程序设计的特点。(3) 争论:将 SHIFT 键及右 SHIFT 键也进展判别处理,它们的扫描码为 42 及 54。为记录 SHIFT 键的按动状态,可设一个标志单元KBFLAG,右 SHIFT 按下,KBFLAG 的 D0 位置 1,左 SHIFT 按下,KBFLAG 的 D1 位置 1,放下左右的 SHIFT 键,KBFLAG 的相应恢复为 0。当程序工作时,应能显示上档键的字符。试验五 字符处理程序试验1. 试验目的(1) 生疏串操作指令的功能与应用(2) 把握串操作指令的寻址方式及使用方法,编
17、写常用的字符串处理程序。2试验内容(1) 字符串统计。自 STRN 开头的存储区中,有一个字符串,统计其中含有小写字母的个数,将统计结果以两位十进制数显示在屏幕上。(2) 在给定的字符串中,删除重复的字符,其余的字符向前递补。3. 试验预备(1) 生疏字符处理的方法和字符处理程序的设计;(2) 认真预习有关串操作的指令极其寻址方式的特点,能够正确使用串操作指令,并预备好数据。(3)按正常的方法将删除字符程序编成子程序,规定子程序的入口和出口参数。4. 试验步骤(1)用 1 号系统调用从键盘键入一个字符串,然后统计其中小写字母的个数。程序每次执行,都能得到不同的结果。(2)编写一个在同一个字符串
18、中删除字符,并将其余字符向前递补的程序。5. 试验报告要求(1) 比照参考程序,画出程序流程图。(2) 总结字符串处理的编程方法,提出改进和完善此类程序的设计方案。试验六 BIOS 和 DOS 中断调用应用程序设计1. 试验目的(1) 了解 DOS、BIOS 调用的根本功能、调用参数、返回参数。以及数据定义 把握中断通信程序的设计方法。(2) 把握如何利用扫描码进展功能把握。2. 试验内容编写一个可以进展光标左右移动和插入字符的简洁字处理程序。3. 试验预备(1) 复习相关内容(2) 了解键盘的扫描码、ASCII 码及其显示字符假设存在可显示字符形式之间的对应关系。4. 试验步骤(1) 建立源
19、文件,汇编、连接产生可执行文件。(2) 运行程序,使得可以输入字符和光标左右移动及字符的插入。5. 试验报告要求(1) 由参考程序,画出简洁字处理程序框图。(2) 争论如何实现光标的上下移动和字符的删除。源程序清单试验 2(1) 编写一个程序 S21,将内存中一组有符号的字数组按递增的序列排序,并将其中的二进制数以十六进制的形式显示在屏幕上。;S21.ASMDSEGSEGMENTXDW234H,32FH,90DH,123EH,-78EH,0ACFH,-234H,98H,-23DFHCOUNTDW9DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGMAINPROCF
20、ARSTART:PUSHDSXORAX,AXPUSHAXMOVAX,DSEGMOVDS,AXMOVCX,COUNTLAB0:MOVBX,1DECCXJZLAB3PUSHCXLEADI,XLAB1:MOVAX,DICMPAX,DI+2JLELAB2XORBX,BXXCHGAX,DI+2MOVDI,AXLAB2:ADDDI,2LOOPLAB1POPCXCMPBX,0JZLAB0LAB3:LEADI,XMOVCX,COUNTLAB4:PUSHCXMOVCH,4MOVBX,DILAB5:MOVCL,4ROLBX,CLMOVDL,BLANDDL,0FHCMPDL,9JBELAB6ADDDL,7LAB6:
21、ADDDL,30HMOVAH,2INT21HDECCHJNZLAB5MOVDL,20HMOVAH,2INT21HADDDI,2POPCXLOOPLAB4MOVDL,0DHMOVAH,2INT21HMOVDL,0AHMOVAH,2INT21HLEADI,XMOVCX,COUNTLAB7:MOVBX,DIPUSHCXMOVCX,16LAB8:XORDL,DLROLBX,1RCLDL,1ADDDL,30HMOVAH,2INT21HLOOPLAB8MOVDL,”B”MOVAH,2INT21HMOVDL,” ”MOVAH,2INT21HADDDI,2POPCXLOOPLAB7RETMAINENDPCSE
22、GENDSENDSTART其中斜体字局部为以二进制输出。(2) 编写一个程序 S22,判别键盘上输入的字符;假设是 1-9 字符,则显示之;假设为 A-Z 或 a-z 字符,均显示“c”;假设是回车字符(其 ASCII 码为 0DH),则完毕程序,假设为其它字符则不显示,连续等待的字符输入。;S22.ASMCODESEGMENTASSUMECS:CODESTART:MOV AH,1INT21H;等待键入字符,送 ALCMPAL,0DH;是否是回车符?JZDONE;是则转 DONE 退出程序CMPAL,”0”JBNEXTCMPAL,”9”JACHARUPMOVDL,ALMOVAH,2INT21H
23、JMPSTARTCHARUP:CMPAL,41HJBNEXTCMPAL,5AHJACHRDNDISPC:MOVDL,”c”MOVAH,2INT21HNEXT:JMPSTARTCHRDN:CMPAL,61HJBNEXTCMPAL,7AHJANEXTJMPDISPCDONE:MOVAH,4CHINT21HCODEENDSENDSTART试验 3.1(1) 编写程序 S31,将 BUF 开头的 10 个字节单元中的二进制数转换成两位十六进制数的 ASCII 码,在屏幕上显示出来。要求码型转换通过子程序 HEXASC 实现,在转换过程中,通过子程序 DISP 实现显示。;S31.ASMDATASEGM
24、ENTBUF DB0ABH,0CDH,0DEH,01H,02H,03H DB3AH,4BH,5CH,6FHDATAENDS CODESEGMENTASSUMECS:CODE,DS:DATA START: MOVAX,DATAMOVDS,AXMOVCX,10LEABX,BUFAGAIN: MOVAL, BXCALL HEXASCINCBXLOOPAGAINMOVAH,4CHINT21HHEXASCPROCNEARPUSHAXMOVDL,ALPUSH CXMOVCL,4SHRDL,CLPOPCXCALLDISP;显示高位 HEX 数POPAXMOVDL,ALANDDL,0FHCALLDISPRET
25、HEXASCENDPDISPPROCCMPDL,9JBENEXTADDDL,7NEXT:ADDDL,30HMOVAH,2INT21H;显示RETDISPENDPCODEENDSENDSTART(2) 编写一个主程序S32,从键盘接收假设干个字符,然后用远调用的方法,调用子程序统计字符串中字符b的个数.子程序的参数是字符串的首地址 TABLE,字符串长度 N 及字符”b”.子程序返回字符b”的个数.参数传送承受堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。DATASEGMENTCHARDB”b”BUFDB50H, ?,50H DUP(?)CRLFDB0DH,0AH
26、,”$” DATAENDSMCODESEGMENTASSUMECS:MCODE, DS:DATA START: MOV AX,DATAMOV DS,AXLEADX,BUFMOV AH,0AHINT LEAMOV AH,9 INTLEA21H DX,CRLF21H SI,BUFMOV CL, SI+1MOV CH, 0;CX 中为字符串长度INC SIINC SI;SI 指向串首址 TABLE MOV AL,CHARMOV AH,0;AX 中为待查字符PUSH SIPUSH CXPUSH AX; 参数送堆栈CALL FAR PTR CHECK MOV DL,CHARINT21H;显示统计个数MO
27、VAH,4CHINT21HMCODEENDSSCODE SEGMENTASSUME CS:SCODE CHECK PROC FARPUSH BP MOV BP,SPMOV SI,BP+10 MOV CX, BP+8 MOV AX, BP+6;统计个数在 AL 中,个数不能超过一位 16 进制数XOR AGAIN: CMPJNE INCNEXT1:INCAH, AH AL,SI NEXT1 AHSIMOVAH,2INT21HPOPAXMOVDL,ALANDDL, 0FHCMPDL,9JBENEXTADDDL,7NEXT:ADDDL,30HMOVAH,2LOOP AGAIN MOV AL, AHM
28、OV BP+10,AXPOPBPRET4CHECKENDP SCODEENDSENDSTART试验 3.2(1) 编写一个子程序,将主程序设定的内存中字符串的小写字母转换成大写字母并显示出来.主程序 S33 用另一个模块编写。EXTRNDNTOUP:FARPUBLICSTRING1,STRING2 DATASEGMENTSTRING1DB”thIs is A book”,”$”STRING2DB80 DUP(?) DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA START:MOVAX,DATAMOVDS, AXCALLFAR PTR DNTOUPMOVAH,4
29、CHINT21HCODEENDSENDSTART;DNTOUP.SM 为子模块的文件名PUBLICDNTOUPEXTRNSTRING1:BYTE,STRING2:BYTE CODESEGMENTDNTOUPPROCFARASSUMECS:CODE MOV BX,0CYCLE:MOV AL,STRING1BXCMP JZ CMP JB CMP JA SUBAL,24H;是否是 STRING1 结尾DONE;是“$“,转 DONEAL,61H;是小写字母吗?NEXT;不是转 NEXT AL,7AHNEXTAL, 20H;转为大写字母NEXT:MOV STRING2BX,ALINC JMPBX CY
30、CLEDONE:MOV AL,”$”MOV STRING2BX,AL;补一个$ MOV DL,0DHMOV AH, 2INT21HMOV DL,0AHINT LEAMOV AH,9 INT21H;显示回车换行DX, STRING121H;显示源串内容MOVDL,0AHMOVAH,2INT21H;回车换行MOVDX,OFFSETSTRING2MOVAH,9INT21H;显示转换后的大写串RETDNTOUPENDP CODEENDSENDDNTOUP(2) 编写一个子程序,将主程序 S34 指定的字符所在的地址返回给主程序,字符串与主程序在同一个模块。;S34.ASM 为主模块程序名EXTRNFI
31、NDC:FARPUBLICSTRNDATASEGMENTSTRNDB”LINK DISPLAY SUBROUTING$”ADDRDW?DATAENDS CODESEGMENTASSUMECS:CODE,DS:DATA START: MOV AX,DATAMOV DS,AX MOV AH,1 INT21HCALL FAR PTR FINDC MOV ADDR, DIMOV AH,4CH INT 21HCODEENDSENDSTART;FINDC.ASM 为子模块程序名PUBLICFINDC EXTRNSTRN:BYTECODESEGMENTASSUMECS:CODE FINDCPROCFARST
32、ART:LEA AGAIN: CMPJZ CMP JNZDONE1: RET NEXT: INC JMPDI,STRNBYTEPTRDI,”$” DONEAL,DI NEXTDI AGAINDONE: MOV DI,0FFFFH;找不到返回 0FFFFHJMP FINDCENDP CODEENDSDONE1ENDSTART试验 4S4 利用 pc 机键盘,编写一个读入并显示键盘输入的演示程序。该程序只承受常规字符包括回车键及退格键,对特别功能键不进展处理。在程序中设置这些特别功能键对应 0 编号即可,但凡检测到键位编号为 0 值时,均无视对它们的处理。有键按下时,送出的扫描码的 D7 位为 0
33、 时,当键抬起时,扫描的码 D7 位为 1,以判定键是否被按下。PUBLICSCANTAB,BUFFER,BUFPT1,BUFPT2 ,KBFLAG STACK1SEGMENTSTACK1 ENDS DATA SEGMENTBUFFER BUFPT1 BUFPT2DB256 DUP(?)DB16 DUP(0);定义 10 个字节的键盘缓冲区DW0;指向键盘缓冲区的起点,头取DW0;指向键盘缓冲区的终点,尾存;留意当 BUFPT1=BUFPT2 时,说明缓冲区空KBFLAG PROMPTDB0DB”-kbd_io program begin”,0DH,0AH,”$”SCANTABDB0,0,”1
34、234567890-=”,8,0DB”QWERTYUIOP”,0,0DB”ASDFGHJKL”,3BH,27H,0DHDB”ZXCVBNM,./”,0DB20H,0,0,0,0,0,0,0,0,0,0,0,0,0;由于不同键盘按键及分布各不一样,因此在调试时可能产生按键和显示有差异DB”789-456+1230.”EVENOLDIP9DW?OLDCS9DW?DATAENDSEXTRNKBINT: FAR;外部引用说明CODESEGMENT;主程序段ASSUMECS:CODE ,DS:DATA START: MOV AX,DATAMOV DS,AX;建立自行设计的中断效劳程序,写自行设计的中断处
35、理程序入口偏移量到矢量表中CLI;关中断,以防引起混乱MOVAX,3509H;取类型 9 的中断向量INT21HMOVOLDCS9,ESMOVOLDIP9,BXPUSH DSLEADX,KBINT MOV AX,SEG KBINT MOV DS,AXMOV AX,2509H;设置类型 9 的中断向量INT POP IN AND OUT LEAMOV AH,9 INT21H DSAL,21HAL,0FDH;允许定时器和键盘中断的把握字送 8259 21H,ALDX,PROMPT;在屏幕上显示-kbd_io program begin -21HSTI;开中断;程序功能:读键盘并显示字符FOREVE
36、R:CALLKBGET;读缓冲区字符TESTKBFLAG,80H;假设输入任意功能键,则使 KBFLAG=80,退出JNZENDINTPUSHAXCALLDISPCHAR;显示接收字符POPAXCMPAL,”A”JZENDINT;输入 A 完毕程序CMPAL,0DH;是回车符吗?JNZFOREVER;不是再接收MOVAL,0AHCALL DISPCHAR;是,换行JMPFOREVER;接收下一行字符ENDINT: MOV DX ,OLDIP9MOV AX ,OLDCS9 MOV DS,AXMOV AH,25H MOV AL,9INT21HMOV AH,4CHINT21H;KBGET1 取缓冲区
37、字符-(返回 KBGETPROCNEARPUSH BX CLIMOV BX,BUFPT1CMP JNZ CMP JNZBX,BUFPT2KBGET2;缓冲区不空,转 KBGET2,取字符KBFLAG,0KBGET3STI;开中断POP JMPBXKBGET;当输入缓冲区为空,且没有按键时循环等待; 取缓冲区字符KBGET2: MOV AL,BUFFER+BX;取缓冲区字符INC CMP JCBX; 首指针加 1BX,16;到缓冲区尾吗? KBGET3; 未到,转,KBGET3MOV BX,0;到,指向缓冲区首KBGET3: MOV BUFPT1,BX;保护首指针POP RETKBGETENDP
38、BX;恢复 BX 存放器;CHAR 字符显示子程序DISPCHARPROCNEARPUSHBXMOVBX,0MOVAH,0EHINT10HPOPBXRETDISPCHARENDPCODEENDSENDSTART;S41;KBINT 键盘中断处理程序EXTRNSCANTAB:BYTE,BUFFER:BYTE,KBFLAG:BYTE,BUFPT1:WORD,BUFPT2:WORD CSEGSEGMENTPARAPUBLIC ”CODE”ASSUMECS:CSEGPUBLICKBINTKBINTPROCFARPUSH BX PUSH AX;读键盘数据,并发确认信号INAL,60H;读 8255A 口
39、,即键盘扫描码PUSH AXINAL,61H;为置确认信号ORAL,80H;置键盘确认信号OUT61H,AL;置 PB7 位并送键盘ANDAL,7FH;恢复键盘确认信号,亦即选通信号OUT61H,AL;将接收的扫描码译为 ASCII 码POPAXTEST AL ,80H;检查是否按下?最高位为 0 或为 1,分别表示键是按下还是放开JNZKBINT2;键抬起放弃本次输入MOV BX ,OFFSETSCANTABXLAT;查表找对应 ASCII 码CMP JNZAL,0;是有效字符键吗? KBINT4MOV KBFLAG,80H;不是有效字符则使得 KBFLAG=80KBINT4:JMPKBIN
40、T2;存 ASCII 码字符到缓冲区MOVBX,BUFPT2;取缓冲区尾指针MOVBUFFER+BX,AL;存字符INCBX;尾指针加 1CMPBX,16;是否到区尾?JCKBINT3;不到,转 ,尾指针小于 16 时转 KBINT3MOVBX,0;到,置尾址 ,缓冲区从 015KBINT3:CMPBX,BUFPT1;缓冲区满?JZKBINT2;此时首尾指针相等说明缓冲区已满,则不保存尾指针,从而无视刚刚输入的字符MOVBUFPT2,BX;不满,存尾指针;完毕中断处理KBINT2:CLIMOVAL,20H;发 EOI ,完毕 8259 中断OUT20H,ALPOPAXPOPBXIRET;中断返
41、回KBINTENDP CSEGENDSENDKBINT试验 5(1) S51 字符串统计。自 STRN 开头的存储区中,有一个字符串,统计其中含有小写字母的个数,将统计结果以两位十进制数显示在屏幕上。DATASEGMENTSTRNDB80 DUP(?) DATAENDSCODESEGMENTASSUMECS:CODE, DS:DATA START: MOV AX, DATAMOV DS, AXLEADI, STRN MOV CL, 0AGAIN: MOV AH, 1INT CMP JZ21H AL,0DH DONEMOV DI,ALINC INC JMPDONE: LEAMOV CH,0 MOV BL,0 CLDCYCLE: LODSBCMP JB CMP JA INCDI CLAGAIN SI,STRNA