《汇编语言第四章程序流程控制语句及程序设计.ppt》由会员分享,可在线阅读,更多相关《汇编语言第四章程序流程控制语句及程序设计.ppt(105页珍藏版)》请在三一办公上搜索。
1、第4章 程序流程控制语句 及程序设计,4.1 程序设计方法概述4.2 顺序程序设计4.3 DOS系统功能调用4.4 分支程序设计4.5 循环程序设计4.6 子程序设计,4.1 概述,4.1.1 汇编语言程序设计的一般步骤4.1.2 流程图,4.1.1 汇编语言程序设计的一般步骤,汇编语言程序设计一般有以下几个步骤:1分析问题,确定算法2绘制流程图3根据流程图编制程序4调试程序,4.1.2 流程图,1流程图的概念流程图是由特定的几何图形、指向线、文字说明来表示数据处理的步骤,形象描述逻辑控制结构以及数据流程的示意图。流程图具有简洁、明了、直观的特点。,2流程图符号表示(1)起止框:表示程序的开始
2、和结束。,起止框,(2)判断框,(3)处理框,(4)调用框,(5)指向线,(6)连接框,4.2 顺序程序设计,下面举例说明顺序程序的设计。【例】试编写一程序计算以下表达式的值。=(v-(*+-540)/x式中x、v均为有符号字数据。设、的值存放在字变量、V中,结果存放在双字变量之中,程序的流程图如图4.1所示。,图4.1 顺序运算程序流程图,源程序如下:DATASEGMENTXDW200YDW100ZDW3000VDW10000WDW2 DUP(?)DATAENDSSTACKSEGMENT STACK DB 200 DUP(0)STACKENDSCODESEGMENTASSUME DS:DAT
3、A,CS:CODE,SS:STACK,START:MOVAX,DATA MOVDS,AX;DATAAX MOVAX,X IMULY;(X)*(Y)DX:AX MOVCX,AX MOVBX,DX;(DX:AX)(BX:CX)MOVAX,Z CWD;(Z)符号扩展 ADDCX,AX ADCBX,DX;(BX:CX)+(DX:AX)(BX:CX)SUBCX,540 SBBBX,0;(BX:CX)-540(BX:CX)MOVAX,V,CWD;(V)符号扩展SUBAX,CXSBBDX,BX;(DX:AX)-(BX:CX)(DX:AX)IDIVX;(DX:AX)/XMOVW,AX;商WMOVW+2,DX;
4、余数DXW+2MOVAH,4CHINT21HCODEENDS;退出DOS 状态 ENDSTART,【例】已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在TAB表中,要查的学生的学号放在变量NO中,查表结果放在变量ENGLISH中。编写程序如下:,STACKSEGMENT STACK DB 200 DUP(0)STACKENDSDATASEGMENTTABDB 80,85,86,71,79,96 DB 83,56,32,66,78,84NO DB 10ENGLIST DB?DATAENDSCODESEGMENT,ASSUME DS:DATA,SS:STACK,CS:CODEBEGIN
5、:MOVAX,DATA MOVDS,AX LEABX,TAB MOVAL,NO DECAL XLATTAB MOVENGLISH,AL MOVAH,4CH INT21H CODEENDS ENDBEGIN,4.3 DOS系统功能调用,4.3.1 系统功能调用方法4.3.2 常用的DOS系统功能调用,4.3.1 系统功能调用方法,DOS系统功能调用的方法一般可分为以下几步:设置所要调用功能的入口参数。在AH寄存器中存入所要调用功能的功能号。INT 21H指令自动转入中断子程序入口。相应中断子程序运行完毕,可按规定取得出口参数。,4.3.2 常用的DOS系统功能调用,1单字符输入(1号调用)2单字
6、符显示(2号调用)3打印输出(5号调用)4结束调用(4CH号调用)5显示字符串(9号调用)6字符串输入(10号调用),1单字符输入(1号调用)格式:MOVAH,1 INT21H功能:接受从键盘输入字符的ASCII码送入寄存器AL中,并送显示器显示。2单字符显示(2号调用)格式:MOV DL,待显示字符的ASCII码 MOV AH,2 INT 21H功能:将DL寄存器中的字符送显示器显示,如果DL中为CTRL+BREAK的ASCII码,则退出。,3打印输出(5号调用)格式:MOVDL,待打印字符的ASCII码 MOVAH,5 INT21H功能:将DL寄存器中的字符送打印机打印。4结束调用(4CH
7、号调用)格式:MOV AH,4CH INT 21H功能:终止当前程序并返回调用程序。,5显示字符串(9号调用)格式:LEADX,待显示字符串首偏移地址 MOVAH,9 INT21H功能:将当前数据区中以结尾的字符串送显示器显示。6字符串输入(10号调用)格式:LEADX,缓冲区首偏移地址 MOVAH,10 INT21H功能:从键盘上输入一字符串到用户定义的输入缓冲区中,并送显示器显示。,10号系统功能调用的输入缓冲存储区的定义,缓冲区名 DB 缓冲区大小;规定输入缓冲区的大小 DB 0;实际输入字符的个数 DB 缓冲区大小 DUP(0);键盘输入的字符存放在该输入缓冲区中例:BUF DB 80
8、 DB 0 DB 80 DUP(0),DATASEGMENTSTRDB 0DH,0AH,Example of string display!DATAENDSSTACK SEGMENT STACKDB100 DUP(0)STACK ENDSCODESEGMENTASSUME DS:DATA,CS:CODE,SS:STACK,【例】若要在屏幕上显示字符串“Example of string display!”,则程序如下:,BEGIN:MOVAX,DATAMOVDS,AXLEADX,STRMOVAH,9INT21HMOVAH,4CH INT21HCODEENDSENDBEGIN,DATASEGME
9、NTINFO1 DB0DH,0AH,INPUT STRING:INFO2 DB0DH,0AH,OUTPUT STRING:BUFA DB81 DB?,【例】从键盘上输入一串字符到输入缓冲区,然后将输入的字符串在显示器上以相反的顺序显示。,DB80 DUP(0)BUFBDB81 DUP(0)DATAENDSSTACKSEGMENT STACK DB200 DUP(0)STACKENDSCODE SEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATA MOVDS,AX,LEADX,INFO1MOVAH,9;9号调用,显示输入提示信息INT21HL
10、EADX,BUFAMOVAH,10;10号调用,键盘输入字符串到缓 冲区BUFAINT21HLEASI,BUFA+1 MOVCH,0;取字符长度CX MOVCL,SIADDSI,CX;SI 指向字符串尾部LEADI,BUFB;DI指向字符串变量BUFB,NEXT:MOVAL,SI MOVDI,AL DECSI INCDI LOOPNEXT MOVBYTE PTR DI,LEADX,INFO2 MOVAH,9;9号调用,显示输出提示信息 INT21H,LEADX,BUFBMOVAH,9;反向显示字符串INT21HMOVAH,4CHINT21HCODEENDSENDSTART,4.4 分支程序设计
11、,4.4.1 控制转移类指令4.4.2 分支程序设计*4.4.3 用跳转表实现多分支程序设计,4.4.1 控制转移类指令,1、无条件转移指令2、条件转移指令,1、无条件转移指令,段内转移:指在同一代码段的范围内进行转移,只需要改变IP寄存器的内容。一般有三种用法。(1)段内直接短转移格式:JMP SHORT 标号名(2)段内直接转移格式:JMP 标号名;该标号的属性为近标号(3)段内间接转移格式:JMP CX;将(CX)寄存器的内容送IP寄存器 JMP WORD PTR 1234H;将字存储单元1234H中的内容送IP寄存器,段间转移:指要转移到另一个代码段去执行程序,此时不仅需要改变IP寄存
12、器中的内容,还要修改CS段寄存器的内容才能达到转移的目的,因此段间转移需要修改两个寄存器中的内容。一般有两种用法。(1)段间直接转移格式:JMP FAR PTR 标号名;该标号具有远属性(2)段间间接转移格式:JMP DWORD PTR 1234H;将双字存储单元的低字内容送IP寄存器,双字存储单元的高字内容送CS寄存器,简单条件转移指令 无符号数条件转移指令 有符号数条件转移指令 判断CX的值为0则转移指令它们都有通用的语句格式和功能。语句格式:标号:操作符 短标号功能:如果条件满足,则(IP)位移量IP。,2、条件转移指令,共有10条指令,根据五个标志位ZF、SF、OF、PF和CF的两种状
13、态(0或1)分别进行转移。(1)JE/JZ;ZF=1则转移,测试前次操作结果是否等于0 JNE/JNZ;ZF=0则转移,测试前次操作结果是否不等于0(2)JS;SF=1则转移,测试前次操作结果是否为负数 JNS;SF=0则转移,测试前次操作结果是否为正数(3)JO;OF=1则转移,测试前次操作结果是否有溢出 JNO;OF=0则转移,测试前次操作结果是否没有溢出,简单条件转移指令,(4)JC;CF=1则转移,测试前次操作结果是否有进(借)位 JNC;CF=0则转移,测试前次操作结果是否无进(借)位(5)JP;PF=1则转移,测试前次操作结果中1的个数是否为偶数 JNP;PF=0则转移,测试前次操
14、作结果中1的个数是否为奇数【例】下面程序段测试AX的低四位是否全0,如果均是0,使CX=0,否则使CX=-1。MOV CX,-1 TEST AX,000FH JNZ NEXT MOV CX,0NEXT:,无符号数条件转移指令,无符号数条件转移指令往往跟在比较指令之后,根据运算结果设置的条件标志状态确定转移方向。这类指令视比较对象为无符号数。根据不同状态设置了高于、高于等于、低于、低于等于四条指令。(1)JA/JNBE;当CF=0且ZF=0时转移。用于两个无符号数a、b的比较,若ab则条件满足实现转移。(2)JAE/JNB;当CF=0或ZF=1时转移。用于两个无符号数a、b的比较,若ab或a=b
15、则条件满足实现转移。(3)JB/JNAE;当CF=1且ZF=0时转移。用于两个无符号数a、b的比较,若ab则条件满足实现转移。(4)JBE/JNA;当CF=1或ZF=1时转移。用于两个无符号数a、b的比较,若ab或a=b则条件满足实现转移。,【例】比较无符号数大小,将较大的数存放AX寄存器。CMPAX,BX;(AX)(BX)JAENEXT;若AX=BX,转移到NEXTXCHGAX,BX;若AXBX,交换NEXT:,有符号数条件转移指令,当比较判断两个有符号数的大小时,要选用有符号数条件转移指令。有符号数条件转移根据条件标志ZF、SF、OF的特定组合决定是否转移。(1)JG/JNLE;当SF=O
16、F且ZF=0时转移。用于两个有符号数a、b的比较,若ab则条件满足实现转移。(2)JGE/JNL;当SF=OF或ZF=1时转移。用于两个有符号数a、b的比较,若ab或a=b则条件满足实现转移。(3)JL/JNGE;当SF OF且ZF=0时转移。用于两个有符号数a、b的比较,若ab则条件满足实现转移。(4)JLE/JNG;当SF OF或ZF=1时转移。用于两个有符号数a、b的比较,若ab或a=b则条件满足实现转移。,【例】比较有符号数大小,将较大的数存放在AX寄存器。CMPAX,BX;(AX)(BX)JGENEXT;若AX=BX,转移到NEXTXCHGAX,BX;若AXBX,交换NEXT:,语句
17、格式:JCXZ 短标号功能:当CX=0时,则转移到标号所指出的地址处执行。,判断CX的值为0则转移指令,4.4.2 分支程序设计,【例】编写计算下面函数值的程序:1X0Y=0X=0-1X0设输入数据为X、输出数据Y,且皆为字节变量。程序流程图如图4.2所示。程序如下:,图4.2 分支运算程序流程图,DATASEGMENTX DB-10Y DB?DATAENDSSTACKSEGMENT STACK DB 200 DUP(0)STACKENDSCODESEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATA,MOVDS,AX CMPX,0;与0进
18、行比较 JGEA1;X0转A1 MOVY,-1;X 0时,-1Y JMPEXITA1:JGA2;X0转A2 MOVY,0;X=0时,0Y JMPEXITA2:MOVY,1;X0,1Y EXIT:MOVAH,4CH INT21H CODE ENDS ENDSTART,【例】试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中。设三个带符号数分别在三个字变量X、Y、Z中存储。程序流程图如图4.3所示:,图4.3 程序流程图,程序如下:STACK SEGMENT STACK DB 200 DUP(0)STACK ENDSDATA SEGMENTX DW 00ABHY DW 5Z D
19、W 200MAX DW?DATA ENDSCODE SEGMENT,ASSUME DS:DATA,SS:STACK,CS:CODE START:MOV AX,DATA MOV DS,AX MOV AX,X CMP AX,Y;XY?JG L1 MOV AX,Y;YZ?CMP AX,Z JG EXITL2:MOV AX,Z JMP EXIT,L1:CMPAX,Z;XZ?JLE L2EXIT:MOVMAX,AX MOVAH,4CH INT21HCODE ENDS END START,4.4.3 用跳转表法实现多分支程序设计(补充),【例】设某程序有8路分支,试根据给定的N值(18),将程序的执行转移
20、到其中的一路分支。程序流程如图4.4所示。,程序如下:DATASEGMENTTABDW P1,P2,P3,P4,P5,P6,P7,P8N DB 5DATAENDSSTACK SEGMENT STACK DB 200 DUP(0)STACKENDSCODESEGMENTASSUME DS:DATA,SS:STACK,CS:CODE,START:MOVAX,DATA MOVDS,AX MOVAL,N DECAL ADDAL,AL;形成表内偏移 MOVBL,AL MOVBH,0 JMPWORD PTR TABBX,P1:JMPEXITP2:JMPEXITP3:JMPEXITP4:,JMPEXITP8
21、:EXIT:MOVAH,4CH INT21HCODEENDS ENDSTART 注:上述程序中的无条件转移指令的转移地址采用的是变址寻址。同理,转移地址也可以用寄存器间接寻址或基址加变址寻址。,4.5 循环程序设计,4.5.1 循环程序的结构4.5.2 单重循环程序设计4.5.3 多重循环程序设计,1)循环指令LOOP2)相等/为零循环指令LOOPE/LOOPZ3)不相等/不为零循环指令LOOPNE/LOOPNZ,循环指令,1循环指令LOOP语句格式:LOOP 短标号功能:(CX)0,则程序转移(循环);否则,顺序执行。说明:使用LOOP指令可代替两条指令,DEC CX JNE 短标号,2相等
22、/为零循环指令LOOPE/LOOPZ语句格式:LOOPE 短标号 LOOPZ 短标号功能:(CX)0且ZF=1,则程序转移(循 环);否则,顺序执行。,分析下面的例子,该程序完成什么功能?DATA SEGMENT BUF DB AAABBCD COUNT EQU$-BUFDATA ENDS MOV AL,A MOV DI,OFFSET BUF MOV CX,COUNT DEC DINEXT:INC DI CMP AL,DI LOOPE NEXT,MOV BX,DI JNZ EXIT MOV BX,0FFFFH;当ZF=1,CX=0时退出循环EXIT:.,功能:在字符串查找是否存在非A字符,若找
23、到,将BX指针指向第一个非A字符,否则置BX为-1。,注意:有两种可能退出循环的执行。(1)计数结束(CX)=0,此时ZF=1,表示所有都是A字符。(2)ZF=0,表示找到非A字符。,3不相等/不为零循环指令LOOPNE/LOOPNZ语句格式:LOOPNE 短标号 LOOPNZ 短标号功能:(CX)0且ZF=0,则程序转移(循 环);否则,顺序执行。,4.5.1 循环程序的结构,1初始化部分2工作部分3修改部分4.控制部分,循环程序的常见结构形式如图4.5(a)、(b)所示。,4.5.2 单重循环程序设计,1计数控制2条件控制,1计数控制,【例】已知有COUNT个字节数据存放在以BUF为首址的
24、存贮区中,编写程序统计负数和正数的个数分别送MINUS和PLUS单元。,对于循环次数已知的情况,通常采用计数控制方法来实现循环。又分为倒计数法和正计数法。,DATA SEGMENT BUF DB-32,25,36,-18,-46,0,-3 COUNT EQU$-BUF PLUS DB?MINUS DB?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV BL,0;统计负数个数的计数器 MOV DL,0;统计正数个数的计数器 MOV SI,OFFSET BUF MOV CX,COUNT,LOP1:
25、MOV AL,SI CMP AL,0;判断是否为正数 JGE NEXT0 INC BL;若为负数,(BL)+1(BL)JMP NEXT1NEXT0:INC DL;若为正数,(DL)+1(DL)NEXT1:INC SI LOOP LOP1 MOV MINUS,BL MOV PLUS,DL MOV AH,4CH INT 21H CODE ENDS END START,【例】编程实现计算如下等式:X1+Y1=Z1;X2+Y2=Z2;X3-Y3=Z3;X4-Y4=Z4;X5-Y5=Z5;X6+Y6=Z6;X7-Y7=Z7;X8+Y8=Z8;X9+Y9=Z9;X10+Y10=Z10;X11+Y11=Z1
26、1;X12-Y12=Z12。分析:采用逻辑尺控制法。用0或1分别表示做减法或加法运算,在该例中形成的逻辑尺为。,DATA SEGMENT X DB 21,34,25,56,23,76,84,92,36,38,69,10 Y DB 61,82,72,37,59,51,26,34,57,80,26,22 Z DB 12 DUP(0)DATA ENDSSTACK SEGMENT STACK DB 100 DUP(0)STACK ENDSCODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATASTART:MOV AX,DATA MOV DS,AX,MOV CX,12 M
27、OV AX,RULE MOV SI,OFFSET X MOV BX,OFFSET Y MOV DI,OFFSET Z LOOP1:MOV DL,SI SHR AX,1;判断是做加法还是减法 JC ADD1;若对应位为“1”做加法 SUB DL,BX JMP END1 ADD1:ADD DL,BX END1:MOV DI,DL;保存运算结果,INC SI INC DI INC BX LOOP LOOP1 MOV AH,4CH INT 21H CODE ENDS END START,2条件控制,【例】设在内存某一数据区从STRING地址开始存放了一个字符串,其最后一个字符为“$”(ASCII码为2
28、4H)。要求检查该字符串中所有字符的奇偶性,规定每个字符对应的一个字节数中必须有偶数个“1”,则为正确。若奇偶性正确,结果为0,否则结果为-1。,对于循环次数未知的情况,通常采用条件控制方法来实现循环。,DATA SEGMENT STRING DB THIS IS A STRING$RESULT DB?DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV BX,OFFSET STRING LOP1:MOV AL,BX INC BX CMP AL,24H;判断是否是“$”结束符 JZ DONE,
29、OR AL,AL;判断数的奇偶性 JNP ERROR JMP LOP1DONE:MOV AH,0 JMP NEXTERROR:MOV AH,-1NEXT:MOV RESULT,AH MOV AH,4CH INT 21H CODE ENDS END START,【例】编写程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不是则退出程序;如是则开始接收键入的字符并顺序存放在首址为BUFFER的缓冲区中(空格符不存入),直到收到第二个空格符时退出程序。,DATA SEGMENT BUFFER DB 80 DUP(0)FLAG DB?DATA ENDSSTACK SEGMENT STACK
30、 DB 200 DUP(0)STACK ENDS,CODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATABEGIN:MOV AX,DATA MOV DS,AX LEA BX,BUFFER MOV FLAG,0NEXT:MOV AH,1 INT 21H TEST FLAG,01H JNZ FOLLOW CMP AL,20H JNZ EXIT,MOV FLAG,1 JMP NEXTFOLLOW:CMP AL,20H JZ EXIT MOV BX,AL INC BX JMP NEXT EXIT:MOV AH,4CH INT 21H CODE ENDS END BEG
31、IN,4.5.3 多重循环程序设计,如果一个循环程序的循环体内还包含一个或多个循环结构的程序,那么这个程序称为双重或多重循环结构程序。,【例】在以BUF为首址的字节存储区中存放有n个无符号数X1,X2,Xn,现要求将它们按从小到大的顺序排列在BUF存储区中,试编写程序。,STACK SEGMENT STACK DB 200 DUP(0)STACK ENDSDATA SEGMENTBUF DB 30H,10H,40H,20H,0FFHN=$-BUFDATA ENDSCODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATASTART:MOV AX,DATA MOV
32、DS,AX MOV SI,1;1(SI),LOPI:MOV DI,SI INC DI;(SI)+1(DI)MOV AL,BUF+SI-1LOPJ:CMP AL,BUF+DI-1 JBE NEXT XCHG BUF+DI-1,AL MOV BUF+SI-1,ALNEXT:INC DI CMP DI,N JBE LOPJ INC SI CMP SI,N-1 JBE LOPI,MOV AH,4CH INT 21H CODE ENDS END START,4.6 子程序设计,4.6.1 子程序的概念4.6.2 子程序的定义4.6.3 子程序设计方法4.6.4 子程序应用举例4.6.5 子程序的嵌套与递
33、归调用,4.6.1 子程序的概念,在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。调用子程序的程序称为主调程序或主程序。,4.6.2 子程序的定义,子程序的定义是由过程定义伪指令PROC和ENDP来完成的。其格式如下:过程名 PROC NEAR/FAR RET过程名 ENDP其中PROC表示过程定义开始,ENDP表示过程定义结束。过程名是过程入口地址的符号表示。一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性。,4.6.3 子程序设计
34、方法,1.子程序的调用和返回2现场的保护与恢复3主程序与子程序参数传递方式,1、子程序的调用和返回,子程序的调用:(1)call proc_name(2)call far ptr proc_name子程序的返回:ret,注意:堆栈中内容的变化!,2现场的保护与恢复,例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则可采用如下方法保护和恢复现场。PROGPROCPUSHAX;保护现场PUSHBX PUSHCXPUSHDX,POPDX;恢复现场POPCXPOPBXPOPAXRET;返回断点处PROCENDP,3主程序与子程序参数传递方式,(1)寄存器法(2)约定单元法(3)堆栈法,
35、4.6.4 子程序应用举例,【例】将一个给定的二进制数按位转换成相应的ASCII码字符串,送到指定的存储单元并显示。如二进制数10010011转换成字符串为10010011。要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8 位和16位二进制数的转换。,入口参数:DX=存放待转换的二进制数 CX=存放待转换数的位数(8位或16位)DI=存放ASCII码首地址出口参数:转换后的字符串存放在以DI作指针的字节存贮区中程序如下:DATASEGMENTNUM8 DB93HNUM16 DW0ABCDHASCBUFDB20DUP(0)DATAENDSSTACK(定义略),CODESEG
36、MENTASSUME DS:DATA,CS:CODE,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVDX,0MOVDL,NUM8;转换二进制数送DXMOVCX,8;置位数8LEADI,ASCBUF;字符串首址DICALLBTASC;调用子程序BTASCMOVDI,BYTE PTR 0DHMOVDI+1,BYTE PTR 0AH,MOV DI+2,BYTE PTR$LEA DX,ASCBUFMOV AH,9INT 21HMOV DX,NUM16MOV CX,16;置位数16 LEA DI,ASCBUFCALL BTASC MOV DI,BYTE PTR 0DHMOV DI
37、+1,BYTE PTR 0AHMOV DI+2,BYTE PTR$LEA DX,ASCBUF MOV AH,9 INT 21H,BTASCPROCPUSHAX;保存AXMOVAL,0CMPCX,8;比较8位数JNEL1;直接转换16位数MOVDH,DL;8位数转换送DHL1:ROLDX,,1;DX最高位移入CFRCLAL,1;CF移入AL最低位ADDAL,30HMOVDI,AL,INCDILOOPL1POPAXRETBTASCENDPCODEENDSENDSTART,【例】排序子程序。子程序名:SORT入口参数:BX存放待排序数组存储区首址 CX存放待排序数组元素的个数出口参数:已排成递增序列
38、的n个无符号数仍放在由BX指示首址的字节存储区中所用寄存器:DX用来存放n-1,即(CX)-1,SORT PROC PUSH AX PUSH DX PUSH SI PUSH DI MOV DX,CX DEC DX MOV SI,1 LOPI:MOV DI,SI INC DI MOV AL,BX+SI-1,LOPJ:CMP AL,BX+DI-1 JBE NEXT XCHG BX+DI-1,AL MOV BX+SI-1,ALNEXT:INC DI CMP DI,CX JBE LOPJ INC SI CMP SI,DX JBE LOPI,POP DIPOP SIPOP DXPOP AX RETSOR
39、T ENDP,思考:考虑调用该子程序的主程序的实现,写出一个调用实例。,4.6.5 子程序的嵌套与递归调用,1子程序的嵌套 子程序不但可以被主程序调用,而且也可以被其他子程序调用。我们把一个子程序调用另一个子程序称为子程序的嵌套调用。2子程序的递归调用 子程序的递归调用是指一个子程序直接或间接地调用自己。递归子程序一般对应于数学上对函数的递归定义,它往往能设计出效率较高的程序,完成相当复杂的计算,因而是很有用的。,【例】子程序嵌套的例子。,设有一个子程序,其说明文件和程序清单如下:子程序名:HTOA功能:将一位16进制数转换为对应的ASCII码入口参数:待转换的数据在AL寄存器的低4位中出口参
40、数:转换后的ASCII码在AL寄存器中,HOTA PROC AND AL,0FH CMP AL,10 JB NEXT ADD AL,7NEXT:ADD AL,30H RETHTOA ENDP,现要求编制将AL中的两位16进制数转换为对应的ASCII码子程序。,子程序名:BHTOA功能:将两位16进制数转换为对应的ASCII码入口条件:两位16进制数在AL中出口条件:高位16进制数对应的ASCII码在AH中,低位16进制数对应的ASCII码在AL中。,BHTOA PROC FAR PUSH CX MOV CH,AL MOV CL,4 SHR AL,CL CALL HTOA MOV AH,AL MOV AL,CH CALL HTOA POP CX RETBHTOA ENDP,本章结束,谢谢!,