汇编语言程序设计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-1CX=0‘0’→DLBX左移一位YNY返DOS解:·486CODESEGMENTUSE16ASSUM