南京邮电大学__微型计算机原理与接口技术_5-01章

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

汇编语言程序设计Ch.5汇编语言程序设计5.1汇编源程序的编程格式5.2DOS系统I/O功能调用5.3BIOS键盘输入功能调用5.5分支程序5.6循环程序5.7子程序及其调用5.8宏指令与条件汇编5.9代码转换5.10数值计算和数据处理5.12模块化程序设计.486DATASEGMENTUSE16MESGDB‘A‘,0DH,0AH,'$'DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,DS:DATABEG:MOVAX,DATAMOVDS,AXDS初值;以上设置┇MOVAH,4CHINT21H;返回DOSCODEENDSENDBEG;汇编结束语句例:将N1和N2两个单字节数以28为模求和→SUM单元.5.1汇编源程序的编程格式1.EXE文件编程格式允许源程序使用多个逻辑段,适合编写大型程序,最终能生成.EXE文件..486DATASEGMENTUSE16N1DBxxN2DBxxSUMDB?DATAENDSSTACK_SEGMENTSTACK‘STACK’USE16DB128DUP(?)STACK_ENDSBEG:MOVAX,DATAMOVDS,AXMOVAX,STACK_MOVSS,AXMOVSP,128MOVAL,N1ADDAL,N2MOVSUM,ALMOVAH,4CHINT21HCODEENDSENDBEG可省CODESEGMENTUSE16ASSUMECS:CODE,DS:DATA,SS:STACK_说明:.EXE文件中堆栈段的设置a本例以“STACK_”为段名的逻辑段,选用了“STACK”链接参数,DOS自动认为“STACK_”段为堆栈段。所以,DOS将自动给SS:SP赋初值,因此,源程序给SS:SP赋初值的三条语句是多余的。b链接程序要求:.EXE文件中的源程序必须有堆栈段,否则链接时将给出警告信息:Warningnostacksegment但这不代表源程序有错,仅仅是警告而已c如果源程序中不设置堆栈段(在链接时,会给出错误信息),DOS将自动给程序分配最少128字节的堆栈区,故源程序中,如果没有大量数据压栈的话,可以不设置堆栈段,从而简化程序。.486DATASEGMENTUSE16N1DBxxN2DBxxSUMDB?DATAENDSSTACK_SEGMENTSTACK‘STACK’USE16DB128DUP(?)STACK_ENDSCODESEGMENTUSE16ASSUMECS:CODE,DS:DATA,SS:STACK_BEG:MOVAX,DATAMOVDS,AXMOVAX,STACK_MOVSS,AXMOVSP,128MOVAL,N1ADDAL,N2MOVSUM,ALMOVAH,4CHINT21HCODEENDSENDBEG2.COM文件的编程格式(1)汇编语言规定:COM文件的源程序只能有一个段:代码段,不允许有堆栈段;在代码段偏移地址=100H处,必须是程序的启动指令;程序中使用的数据可以放在代码段的开始或结尾..486.486CODESEGMENTUSE16CODESEGMENTUSE16ASSUMECS:CODEASSUMECS:CODEORG100HORG100HBEG:JMPSTARTBEG:MOVAL,N1N1DBXXADDAL,N2N2DBXXMOVSUM,ALSUMDB?MOVAH,4CHSTART:MOVAL,N1INT21HADDAL,N2N1DBXXMOVSUM,ALN2DBXXMOVAH,4CHSUMDB?INT21HCODEENDSCODEENDSENDBEGENDBEG(2)上例写成COM格式源程序(3)COM文件的生成设上例的文件名为N1ADDN2.ASM编辑生成N1ADDN2.ASM调用TASM.EXE生成N1ADDN2.OBJTASMN1ADDN2调用TLINK.EXE生成N1ADDN2.COMTLINKN1ADDN2/t注意:链接参数为小写字母tDOS系统I/O功能的调用DOS操作系统由四个部分组成,其中:IBMDOS.COM:是磁盘文件管理程序IBMBIO.COM:是基本I/O设备处理程序这两个模块中都有若干子程序,供应用程序调用,可调用的子程序集中存放在“21H型中断服务程序”中,用户程序调用这些子程序就称为“DOS系统功能调用”BIOS/DOS调用模式:MOVAH,功能号设置入口参数INTn分析出口参数BIOS/DOS功能调用1.调用模式MOVAH,功能号设置入口参数INT21H分析出口参数AH=?执行1#子程序执行2#子程序IRET21H型中断服务程序=1=25.2DOS系统I/O功能调用在DOS功能子程序调用中,我们把通过INT21H来实现的子程序调用成为DOS系统功能调用。[功能号01]等待键入一个字符,有回显,响应Ctrl_C。入口参数:无;出口参数:AL=按键的ASC码.若AL=0,表明按键是功能键、光标键,需再次调用此功能,才能返回按键的扩展码。[功能号07]等待键入一个字符,无回显,不响应Ctrl_C。入口参数:无;出口参数:AL=按键的ASC码.若AL=0,需再次调用该功能才能在AL中得到按键的扩展码。.[功能号08]等待键入一个字符,无回显,响应Ctrl_C。入口参数:无;出口参数:AL=按键的ASC码,若AL=0,需再次调用该功能才能在AL中得到按键的扩展码。2键盘功能的调用[功能号0AH]等待键入一串字符,送用户程序数据缓冲区入口参数、出口参数如图所示。程序员预置可容纳的字符个数(包括回车键)0AH功能写入实际接收的字符个数(不包括回车键)数据缓冲区BUF+0+1+2...+n键入字符串的实际存储区域使用0AH号功能的几点说明:①要求键入的字符串以“回车”作为结束标志,换句话说,按下回车键后,此功能调用结束,光标返回当前行始格。“回车”符留在缓冲区当中。②缓冲区要设置在用户程序数据段,调用前,缓冲区首址偏移量应赋给DX寄存器;③缓冲区首单元应预置“允许接受的字符个数”(包括回车符在内,最多255个);程序员预置可容纳的字符个数(包括回车键)0AH功能写入实际接收的字符个数(不包括回车键)数据缓冲区BUF+0+1+2...+n键入字符串的实际存储区域④DOS的操作:接受的键入的字符串从BUF+2单元开始依次存放。因此,设置的缓冲区容量要不小于键入串的长度+2;用户键入回车后,把实际键入的字符个数(不包括回车符)写入BUF+1单元;缓冲区不接受超长字符,并发出声响以示警告。程序员预置可容纳的字符个数(包括回车键)0AH功能写入实际接收的字符个数(不包括回车键)数据缓冲区BUF+0+1+2...+n键入字符串的实际存储区域0AH在接收字符的过程中,有回显,响应Ctrl_C,按下退格键可删除屏幕及缓冲区中的当前字符。程序员预置可容纳的字符个数(包括回车键)0AH功能写入实际接收的字符个数(不包括回车键)数据缓冲区BUF+0+1+2...+n键入字符串的实际存储区域下面的程序段给出了0AH功能调用的示范,它允许用户键入15个字符(包括回车键)。假设:数据段BUFDB15DB?DB15DUP(?)代码段…...MOVAH,0AHMOVDX,OFFSETBUFINT21H…...[功能号0CH]清除键盘缓冲区,然后调用由AL指定的功能。入口参数:AL允许是:01H键入一个字符,有回显,响应Ctrl_C。06H字符I/O。07H键入一个字符,无回显,不响应Ctrl_C。08H键入一个字符,无回显,响应Ctrl_C。0AH键入一串字符,写入用户数据区。其他入口参数应根据相关的功能,另行设置。[功能号02H]显示一个字符,响应Ctrl_C入口参数:DL=待显字符的ASC码。出口参数:无。本功能在屏幕的当前位置显示一个字符,光标右移一格,如果是在一行末尾显示字符,则光标返回下一行的开始格。如果是在屏幕的右下角显示字符,光标返回时屏幕要上滚一行。3.显示功能的调用注意:该项功能破坏AL寄存器的内容。[功能号09H]显示字符串,响应Ctrl_C。入口参数:DS:DX=字符串首地址,字符串必须以‘$’为结束标志。(ASC码24H)出口参数:无。该项功能从屏幕当前位置开始,显示字符串,遇到结束标志‘$’时停止,‘$’字符并不显示。注意:该项功能破坏AL寄存器的内容。[功能号4CH]该功能是指,终止当前程序的运行,并把控制权交给调用它的程序。由被终止程序打开的全部文件都被关闭,该项功能还把程序占用的内存空间交还给DOS另行分配。该项功能允许被终止的程序传送一个“返回码”给调用它的程序。假若被终止的程序是由DOS命令调入的,那么返回码可以被DOS批处理命令中的“IFERRORLEVEL”子命令识别。入口参数:AL=返回码(或者不设置)。出口参数:无。说明:当用户程序执行1,2,8,9,0AH,0BH,OCH功能调用时,如果键入Ctrl_C或者Ctrl_Break,DOS将自动调用INT23H中断处理程序,从而强行使用户程序中断,我们称为响应Ctrl_C。4.其它功能的调用例:人机会话程序。问题:如何设置程序运行所需的数据?有以下几种方法数据设置在程序的数据段程序运行时通过人机会话临时键入程序装入时通过命令行参数给出本例学习前两种方法,并以此学习DOS功能调用。Limai?(Y/N)Whatisyourname?(1)会话内容及设计思路Linai;前者是程序给出的询问信息,后者是用户键入的回答N;程序复制的姓名和回答提示Limai;再次问答Linai?(Y/N)Whatisyourname?Y(2)框图:显示询问信息等待键入姓名串复制姓名串等待用户认可Y/NY返回DOS9#功能0AH#功能9#1#NDATASEGMENTUSE16MESG1DB0DH,0AHDB‘Whatisyourname?$’MESG2DB‘?(Y/N)$’BUFDB30DB?DB30DUP(?)DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,DA:DATABEG:MOVAX,DATAMOVDS,AXAGAIN:MOVAH,9MOVDX,OFFSETMESG1INT21H;询问姓名MOVAH,0AHMOVDX,OFFSETBUFINT21H;接收键入字符串MOVBL,BUF+1MOVBH,0.486;实际键入的字符个数BXMOVSI,OFFSETBUF+2MOVBYTEPTR[BX+SI],‘$’;用‘$’作为串结束符MOVAH,2MOVDL,0AHINT21H;光标下移一行MOVAH,9MOVDX,OFFSETBUF+2INT21H;复制键入的字符串MOVAH,9MOVDX,OFFSETMESG2INT21H;给出认可信息MOVAH,1INT21H;等待键入CMPAL,‘Y’;比较JNEAGAINMOVAH,4CHINT21H;返回DOSCODEENDSENDBEG5.3BIOS键盘输入功能调用(自学)主板EPROM中固化有基本I/O系统程序—BIOS,它是最接近硬件的驱动程序,BIOS中的许多子程序可被用户程序调用,调用这些子程序称为BIOS功能调用。结构化程序设计顺序结构分枝结构循环机构子程序顺序结构.486DATASEGMENTUSE16SIGNDB‘A‘DATAENDSCODESEGMENTUSE16ASSUMECS:CODEBEG:MOVAX,DATAMOVDS,AXMOVAH,2MOVDL,SIGNINT21HMOVAH,4CHINT21HCODEENDSENDBEG1分枝结构Y条件成立?N┇┇简单分枝5.5分支程序N条件1成立?YN条件2成立?Y┇N条件n成立?Y┇┇复合分枝K=?┇┇┇┅多分枝例1.二进制数显示将BX寄存器中的内容以二进制数格式→屏显DOS功能调用BIOS功能调用:(本例令BX=5678H)2.示例N数→BX,16次→CXC=0‘1’→DL调显示程序CX-1CX=0‘0’→DLBX左移一位YNY返DOS解:·486CODESEGMENTUSE16ASSUM

1 / 118
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功