您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 第四章 汇编语言程序设计(第二讲) chap4_2
14.2.4过程定义伪指令PROC、ENDP过程就是子程序。一个过程可以被其它程序所调用(用CALL指令),过程的最后一条指令一般是返回指令(RET)。过程定义伪指令的格式为过程名PROC[类型]……RET过程名ENDP注意:PROC和ENDP必须成对出现。2过程的类型有两种:NEAR——(默认类型)表示段内调用FAR——表示段间调用调用一个过程的格式为:CALL过程名34.2.5宏定义伪指令如果需要多次使用同一个程序段,可以将这个程序段定义为一个”宏指令”,然后在需要时,可简单地用宏指令名来代替这个程序段。指令的格式为:宏指令名MACRO[形参表]宏定义体ENDM4例:两个数之和的宏定义和宏调用。宏定义为:DADDMACROX,Y,ZMOVAX,XADDAX,YMOVZ,AXENDMX、Y、Z是形式参数。调用宏DADD时可写为:DADDDATA1,DATA2,SUMDATA1,DATA2,SUM是实际参数,由它们替换定义中的X、Y、Z。5宏调用与过程(子程序)调用都是一次定义,多次调用。它们之间的差别是:①执行形式:宏命令伪指令由宏汇编程序在汇编过理中进行处理,而CALL、RET则是由CPU执行的指令。②汇编结果:宏命令伪指令汇编后被展开。③执行速度:宏命令执行速度较快(因无调用转移)④占用内存:宏指令简化了源程序,但不能简化目标程序,并不节省内存单元。使用过程可以节省代码占用的内存空间。6宏展开:汇编程序会把宏调用按宏定义展开。例如:宏定义为:DisplayMACROstringLEADX,stringMOVAH,9INT21HENDM程序中宏调用:……DISPLAYERROR_MESSAGEDISPLAYEXIT_MESSAGE……汇编后的结果:(带有+号的指令为宏展开后的结果)……+LEADX,ERROR_MESSAGE+MOVAH,9+INT21H+LEADX,EXIT_MESSAGE+MOVAH,9+INT21H……74.2.6汇编结束伪指令END汇编语言源程序的最后,要加汇编结束伪指令END,以使汇编程序结束汇编。格式:END[表达式]END后跟的表达式通常就是程序第一条指令的标号,指示程序的启动地址(要执行的第一条指令的地址)。8汇编语言的一个实例:EXAM.ASM94.3DOS系统功能调用介绍系统功能调用——由OS提供的一组实现特殊功能的子程序供程序员在程序中调用,以减轻编程工作量。系统功能调用有两种,一种称为DOS功能调用,另一种称为BIOS功能调用。用户程序在调用这些系统服务程序时,不是用CALL命令,而是采用软中断指令INTn来实现。在DOS系统中,功能调用都是用软中断指令INT21H来实现的。10INT2lH功能大致可以分为四个方面:设备管理、目录管理、文件管理和其它。参见P411页附录C.3D0S系统功能调用的使用方法如下:①AH←功能号;②设置该功能所要求的其他入口参数;③执行INT21H指令;④分析出口参数。以下介绍INT21H的几个最常用的功能。11关于数据输入和输出我们这里只讨论键盘输入和显示输出,调用系统功能需要提供入口参数及所调用的功能号,调用结束返回结果。1.DOS键盘功能调用(1)从键盘输入一个字符(功能号=1)MOVAH,1INT21HAL中有键入的字符12例:程序中有时需要用户对提示做出应答。GET_KEY:MOVAH,1;等待键入字符INT21H;结果在AL中CMPAL,’Y’;是’Y’?JZYES;是,转YESCMPAL,’N’;是’N’?JZNO;是,转NOJMPGET_KEY;否则继续等待输入YES:……NO:…13(2)输入字符串(功能号=0AH)此功能调用从键盘输入一串字符并把它存入用户指定的缓冲区中。MOVAH,0AHLEADX,字符串缓冲区首地址INT21H(预留的N1个字节的存储单元)0DHN2N1N1:缓冲区长度(最大键入字符数)N2:实际键入的字符数(不包括回车符)用户定义的输入字符串的缓冲区格式14若用户键入的字符数(包括回车)≥定义的N1,本功能调用将不再接收新的键入,且光标不再向右移动。例:设在数据段定义键盘缓冲区如下:STR1DB10,?,10DUP(?)调用DOS功能的0AH号功能的程序段为:LEADX,STR1MOVAH,0AHINT21H此程序段最多从键盘接收10个按键(包括回车)。152.DOS显示功能调用(1)在显示器上显示一个字符(功能号=2)MOVAH,2MOVDL,要显示的字符INT21H例:在显示器上显示一个字符‘A’MOVAH,2MOVDL,’A’;或MOVDL,41HINT21H16MOVAH,9LEADX,字符串INT21H注意:被显示的字符串必须以’$’结束。(2)显示字符串(功能号=9)17例:在屏幕上显示:’HELLO,WORLD!’;在数据段定义字符串:DATASEGMENTSTR1DB‘HELLO,WORLD!$’DATAENDS;在代码段中进行显示输出MOVAH,9LEADX,STR1INT21H完整的程序:HELLO.ASM18附:BIOS功能调用BIOS:基本输入输出系统,是固化在EPROM中的一组实现基本输入输出功能的子程序。BIOS调用通过多个软中断提供,调用方法为:MOVAH,功能号设置入口参数,一般将参数放在寄存器中INT中断类型BIOS中的几个主要中断类型如下:INT10H——屏幕显示INT13H——磁盘操作INT14H——串行口操作INT16H——键盘操作INT17H——打印机操作每类中断由包含许多子功能,调用时通过功能号指定。BIOS功能调用说明见p416附录D。194.4汇编语言程序设计基础4.4.1概述1.程序质量(自学)2.汇编语言程序设计的步骤:1-根据实际问题抽象出数学模型,确定算法2-画出程序框图(流程图)3-分配内存工作单元和寄存器4-根据框图编写源程序,存成.ASM文件5-对源程序汇编,生成.OBJ目标文件6-把.OBJ文件连接成.EXE执行文件7-运行、调试3.源程序的基本结构:顺序、分支、循环、过程20(1)用方框表示工作框,框中用简明语言标明要完成的功能(2)用菱形框表示判断框框中标明比较、判断和条件如何绘制程序框图(流程图)?NY?21(4)各框之间用直线连起来表示程序走向。框中标明子程序名字(入口参数等)(3)用框表示调用子程序或过程。流程图的例子FlowChart.doc22汇编语言上机过程YYYNNN有错?有错?有错?结束汇编输入(修改)源程序连接运行查错开始用EDIT,NOTEPAD等任何文本编辑器。源程序存为.ASM文件用MASM宏汇编程序进行汇编。汇编后生成.OBJ目标文件。命令格式:MASM源文件名.ASM;用LINK连接程序进行连接。连接后生成.EXE可执行文件。命令格式:LINK目标文件名.OBJ;用TD、DEBUG等调试程序进行调试。命令格式:TD可执行文件名.EXE23标号:条件满足?处理4.4.2顺序程序(p175-176,自学)4.4.3分支程序NYIF…THEN结构程序结构:…测试/比较指令(TEST/CMP)条件转移指令(Jx标号)处理体标号:其他指令…24程序结构:TEST/CMP指令Jx标号1处理体P1JMP标号2标号1:处理体P2标号2:其他指令…条件满足?处理P1处理P2标号1:标号2:条件1条件2IF…THEN…ELSE结构25标号1:条件1成立?P1NYCASE结构程序结构:…TEST/CMP指令(测试条件1)Jx标号1;不满足转标号1处理体P1…JMP标号n+1标号1:TEST/CMP指令(测试条件2)Jx标号2;不满足转标号2处理体P2…JMP标号n+1标号2:TEST/CMP指令(测试条件3)Jx标号3;不满足转标号3处理体P3…JMP标号n+1标号3:TEST/CMP指令(测试条件4)……标号n+1:(公共出口)条件2成立?条件n成立?…Pn+1标号2:标号n:标号n+1:P2PnNNYY例:P178,[例4-14],统计成绩。流程图中虚线框内264.4.4循环程序1.DO…UNTIL条件结构先执行,再判断条件。工作部分至少执行一次。初始化循环体循环控制继续循环?YN272.DOWHILE条件结构先判断条件,再执行。工作部分有可能一次都不执行。初始化循环体循环控制继续循环?YN28注意:循环可以嵌套(多重循环),但多个循环体之间不能交叉,控制条件不能混淆。例:P179[例4-15],数据从大到小排序。冒泡法——实例:3,7,2,8,6→8,7,6,3,2。内外两层循环;每轮内循环使一个最小的数沉底,因为最小的数沉底,下轮内循环就不用再比较最底下的数,所以内循环的循环次数每一轮比上一轮要逐次减1;外循环用于控制有多少轮内循环。若有n个数据,则外循环次数为n-1。BSORT.ASM29掌握以下几点:调用子程序用CALL指令,返回调用程序用RET指令。子程序允许嵌套调用。进入子程序后首先要保护主程序的运行状态(标志位)和使用的寄存器内容(称为保护现场),退出子程序前要恢复现场。调用前要预先确定子程序中要使用哪些寄存器,并定义入口参数和出口参数。参数传递可利用寄存器、存储单元或堆栈(要用BP寻址)。4.4.5子程序设计举例30例1:二进制数(0-F)转换成ASCII(‘0’-‘F’)的子程序。BIN2ASCPROC;要转换的数在AL的低四位;转换结果仍在AL中CMPAL,9JAA2FADDAL,30HJMPDONEA2F:ADDAL,37HDONE:RETBIN2ASCENDP调用方法:(在主程序中)…MOVAL,0CHCALLBIN2ASC(AL中有0CH的ASCII码43H,’C’)31例2.字符串处理程序设计此例取自p182[例4-17]。对字符串进行操作时,往往需要确定它的长度。通常字符串结束标志以CR或$作标志。所以可以用扫描CR或$的方法计算出串长。在计算串长时,应注意串长一般应小于255个字节。以下是流程图和源程序。32简化的流程图:开始求串长串长256?显示串长高位显示串长低位结束Y警告:太长求串长当前字符是‘$’?搜索CR字符同时指针增量返回N串长加1存串长N找到?NYY初始化指针/计数器33程序如下:DATASEGMENTSTRINGDB‘Thisisastring…’,0DH,’$’LENGTH1DW?;串长度存放在这里CRDB0DHMESSAGEDB’Thestringistoolong!’,0DH,0AH,’$’DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARBEGIN:MOVAX,DATAMOVES,AXMOVDS,AX34CALLSTRLEN;调用子程序计算串长MOVDX,LENGTH1;结果在DX寄存器中CMPDX,100HJBNEXT1;若(DX)<100H,转LEADX,MESSAGE;若(DX)≥100H,MOVAH,9INT21H;显示信息JMPNEXT2NEXT1:MOVDH,DL;串长暂存在DH中MOVCL,4SHRDL,CL;取串长高4位CMPDL,935JBELP;≤9,转ADDDL,7;>9,加7LP:ADDDL,30H;高4位转换为ASCII码MOVAH,6INT21H;显示这个ASCII码MOVDL,DH;取暂存串长ANDDL,0FH;取串长低4位CMPDL,9JBELP1;≤9,转ADDDL,7;>9,加7LP1:ADDDL,30H;低4位转换为ASCII码MOVAH,6INT21H;显示该ASCII码36MOVDL,’H’MOVAH,6INT21H;显示’H’NEXT2:MOVAH,4CHINT21H;返回DOSMAINENDP;-------主程序结束--------;;-----计算串长的子程序-----STRLENPROCLEADI,STRINGMOVCX,0FFFFH;(CX)=-1MOVAL,CR;(AL
本文标题:第四章 汇编语言程序设计(第二讲) chap4_2
链接地址:https://www.777doc.com/doc-3154166 .html