六章子程序结构.ppt

上传人:sccc 文档编号:5361131 上传时间:2023-06-29 格式:PPT 页数:64 大小:1.30MB
返回 下载 相关 举报
六章子程序结构.ppt_第1页
第1页 / 共64页
六章子程序结构.ppt_第2页
第2页 / 共64页
六章子程序结构.ppt_第3页
第3页 / 共64页
六章子程序结构.ppt_第4页
第4页 / 共64页
六章子程序结构.ppt_第5页
第5页 / 共64页
点击查看更多>>
资源描述

《六章子程序结构.ppt》由会员分享,可在线阅读,更多相关《六章子程序结构.ppt(64页珍藏版)》请在三一办公上搜索。

1、第六章 子程序结构,6.1 子程序的设计方法6.2 嵌套与递归子程序6.3 子程序举例6.4 DOS系统功能调用,6.1 子程序的设计方法,一、子程序指令二、子程序的调用与返回三、现场的保护与恢复四、子程序参数的传递,一、子程序指令,子程序是完成特定功能的一段程序当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行当运行完子程序功能后,采用RET返回指令回到主程序继续执行,一、子程序指令调用指令,CALL指令分成4种类型(类似JMP)CALL label;段内调用、直接寻址CALL r16/m16;段内调用、间接寻址CALL far ptr label;段间调

2、用、直接寻址CALL far ptr mem;段间调用、间接寻址CALL指令需要保存返回地址:段内调用偏移地址IP入栈 SPSP2,SS:SPIP段间调用偏移地址IP和段地址CS入栈 SPSP2,SS:SP CS SPSP2,SS:SP IP,一、子程序指令返回指令,根据段内和段间、有无参数,分成4种类型RET;无参数段内返回RET i16;有参数段内返回RET;无参数段间返回RET i16;有参数段间返回需要弹出CALL指令压入堆栈的返回地址段内返回偏移地址IP出栈 IPSS:SP,SPSP2段间返回偏移地址IP和段地址CS出栈 IPSS:SP,SPSP2 CSSS:SP,SPSP2,一、子

3、程序指令返回指令RET的参数,RET i16;有参数返回RET指令可以带有一个立即数i16,则堆栈指针SP将增加,即SPSP+i16这个特点使得程序可以方便地废除若干执行CALL指令以前入栈的参数,二、子程序的调用与返回,二、子程序的调用与返回书写形式(同一代码段内),二、子程序的调用与返回书写形式(不同代码段),三、现场的保护与恢复,现场:主程序转向子程序之前,其所使用的一些资源的状态(如标志位、R/M等)子程序与主程序分别编制,通常会导致使用的资源发生冲突而影响主程序在调用子程序之后的正确执行方法:利用堆栈在主程序中进行在子程序中进行,三、现场的保护与恢复在主程序中进行,PUSH BXPU

4、SH AXCALL SUB1POP AXPOP BX,注意:进栈/出栈的顺序,保护与恢复的对象:主程序用到的存有数据、中间结果且在CALL指令后还要用到的R/M,三、现场的保护与恢复在子程序中进行,SUB1 PROCPUSH BXPUSH AXPOP AXPOP BXRETSUB1 ENDP,注意:进栈/出栈的顺序,保护与恢复的对象:子程序用到的R/M,四、子程序参数的传递,入口参数(输入参数):主程序提供给子程序出口参数(输出参数):子程序返回给主程序参数的形式:数据本身(传值)数据的地址(传址)传递的方法:寄存器 变量 堆栈,例:将两个给定的二进制数转换成为二进制数的ASCII 码形式并加

5、以显示,对两个数进行转换、显示的工作是相同的,没有必要重复编写,以子程序的形式来完成,例:将两个给定的二进制数转换成为二进制数的ASCII码形式并加以显示(6-1-1.asm),方法一:用寄存器传递参数,;转换子程序 BINASCPROC REP1:ROL BX,1MOV DL,BLAND DL,01HADD DL,30H;屏蔽除最低位外的其他位MOV DI,DLINC DILOOP REP1RET BINASCENDP,;显示子程序DISPPROCREP2:MOV AH,2MOV DL,DIINT 21HINC DILOOP REP2MOV DL,0AH;设置显示后的光标位置MOV AH,2

6、INT 21HMOV DL,0DHMOV AH,2INT 21HRETDISP ENDP,DSEG SEGMENT PARA DATABIN1DB 35HBIN2 DW 0AB48HASCBUFDB 20H DUP(?)DSEGENDSCSEG SEGMENT PARA CODEASSUME CS:CSEG,DS:DSEG,SS:SSEGMAIN PROC FARMOV AX,DSEGMOV DS,AXMOV BH,BIN1MOV CX,8LEA DI,ASCBUFPUSH DIPUSH CXCALL BINASCPOP CXPOP DIPUSH DICALL DISPPOP DIADD DI

7、,10HMOV BX,BIN2MOV CX,16PUSH DIPUSH CXCALL BINASCPOP CXPOP DICALL DISPMOV AX,4C00HINT 21H,;转换子程序BINASCPROCREP1:ROL BX,1MOV DL,BLAND DL,01HADD DL,30H;屏蔽除最低位外的其他位MOV DI,DLINC DILOOP REP1RETBINASCENDP;显示子程序DISPPROCREP2:MOV AH,2MOV DL,DIINT 21HINC DILOOP REP2MOV DL,0AH;设置显示后的光标位置MOV AH,2INT 21HMOV DL,0D

8、HMOV AH,2INT 21HRETDISP ENDPMAIN ENDPCSEG ENDSEND MAIN;set entry point,例:将两个给定的二进制数转换成为二进制数的ASCII码形式并加以显示(6-1-2.asm),方法二:用堆栈传递参数,方法二之主程序段MOV AH,BIN1;要转换的数进栈PUSH AXLEA DI,ASCBUF;地址指针PUSH DIMOV AX,8;长度PUSH AXCALL BINASC;调用转换子程序MOV AX,BIN2PUSH AXADD DI,10HPUSH DIMOV AX,16PUSH AXCALL BINASC,;转换并显示子程序BIN

9、ASCPROCPUSH DIPUSH AXPUSH BXPUSH CXPUSH DXPUSH BPMOV BP,SPMOV BX,BP+18MOV DI,BP+16MOV CX,BP+14REP1:ROL BX,1MOV DL,BLAND DL,01H;屏蔽除最低位外的其他位ADD DL,30HMOV DI,DLMOV AH,6INT 21HINC DILOOP REP1,MOV AH,6MOV DL,0AHINT 21HMOV AH,6MOV DL,0DHINT 21HPOP BPPOP DXPOP CXPOP BXPOP AXPOP DIRET 6BINASC ENDP,方法二之堆栈,6.

10、2 嵌套与递归子程序,嵌套:子程序调用其他子程序,嵌套层数取决于堆栈的大小32K(基本不受限制)递归:子程序调用自己,该情况要合理设置出口参数,否则会造成程序死锁,6.3 子程序举例,例 6.3 十进制到十六进制数的转换(从键盘取得一个十进制数,然后把该数以十六进制的形式在屏幕上显示出来),例 6.3 十进制到十六进制数的转换(6-3-1.DOC),转换方法:1234(0*10+1)*10)+2)*10+3)*10+4从最高位开始:累加和*10+本位的权值十六进制数显示的实现,从最高位开始,;例6-3,十进制到十六进制数的转换SSEG SEGMENT PARA STACK STACKDW 10

11、0H DUP(0)SSEG ENDS DSEG SEGMENT PARA DATADSEG ENDSCSEG SEGMENT PARA CODEASSUME CS:CSEG,DS:DSEG,SS:SSEGMAIN PROC FARMOV AX,DSEG;MAKE NECCESSARY INITALIZALITIONMOV DS,AXREPEAT:CALL DECIBINCALL CRLFCALL BINIHEXCALL CRLFJMP REPEATMOV AH,0AHINT 21HMOV AX,4C00H;RETURN DOSINT 21HMAIN ENDP,;从键盘获得十进制数并将其转换成十

12、六进制数置于BX中DECIBINPROCMOV BX,0NEWCHAR:MOV AH,1INT 21HSUB AL,30HJL EXIT;非十进制数则退出CMP AL,9JG EXITCBWXCHG AX,BX;将原有的数*10后加新输入的数MOV CX,10MUL CXXCHG AX,BXADD BX,AXJMP NEWCHAREXIT:RETDECIBINENDP,;将BX中的十六进制数转换成相应的ASCII码显示在屏幕上BINIHEXPROC MOV CH,4;共四位十六进制数ROTATE:MOV CL,4ROL BX,CLMOV AL,BL;从最高位开始,将其移位至BX,AL的低4位A

13、ND AL,0FHADD AL,30HCMP AL,3AHJL PRINTITADD AL,7;如为A-F的处理PRINTIT:MOV DL,ALMOV AH,2INT 21HDEC CHJNZ ROTATERETBINIHEX ENDP,CRLFPROCMOV DL,0AHMOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HRETCRLFENDPCSEG ENDSEND MAIN;SET ENTRY POINT,例 6.8 把以ASCII码形式表示的十进制数转换成二进制数(6-8-2.asm,6-8-1.asm增强型编程),程序限制:转换后的二进制数不超过16位转

14、换方法:12345,从最低位开始,增强功能的过程定义伪操作,格式:PROCNAMEPROC ATTRIBUTES FIELD USES REGISTER LIST,PARAMETER FIELDPROCNAMEENDPATTRIBUTES FIELD:DISTANCE LANGUAGE TYPEVISIBILITYPROLOGUE,增强功能的过程定义伪操作,例6.8,.MODEL SMALL.STACK 64.DATAASCVALDB 12345BINVALDW?.CODEMAIN PROC FARMOV AX,DATAMOV DS,AXLEA BX,ASCVALPUSH BXLEA BX,B

15、INVALPUSH BXCALL CONVASCBINMOV BX,BINVALCALL BINIHEXMOV AX,4C00HINT 21HMAIN ENDP,CONVASCBINPROC PASCAL USES AX BX CX SI DI,PAR1:WORD,PAR2:WORDLOCAL ASCLEN:WORD,MULFACT:WORDMOV BX,10MOV SI,PAR1MOV DI,PAR2SUB DI,SIMOV ASCLEN,DIMOV CX,DIADD SI,CXDEC SIMOV MULFACT,1MOV DI,PAR2MOV WORD PTR DI,0NEXT:MOV A

16、L,SIAND AX,000FHMUL MULFACTADD DI,AXMOV AX,MULFACTMUL BXMOV MULFACT,AXDEC SILOOP NEXTRETCONVASCBINENDP,BINIHEXPROC MOV CH,4ROTATE:MOV CL,4ROL BX,CLMOV AL,BLAND AL,0FHADD AL,30HCMP AL,3AHJL PRINTITADD AL,7PRINTIT:MOV DL,ALMOV AH,2INT 21HDEC CHJNZ ROTATERETBINIHEX ENDPEND MAIN;SET ENTRY POINT,例:6.9 十六

17、进制到十进制数的转换,把从键盘输入的0-FFFF的十六进制正数转换成十进制数并在屏幕上显示出来Hexibin:键盘输入十六进制数其数值在BX中crlf:回车换行Binidec:十六进制到十进制转换并显示,例6.9,DISPEQU 2HKEY_INEQU 1HDOSCALL EQU 21HSSEG SEGMENT PARA STACK STACKDW 100H DUP(0)SSEG ENDS CSEG SEGMENT PARA CODEASSUME CS:CSEG,SS:SSEGMAINPROC FARMOV CL,4CALL HEXIBIN;调用十六进制数输入子程序CALL CRLFCALL

18、BINIDEC;调用十六进制到十进制转换子程序CALL CRLFJMP MAINMOV AX,4C00HINT 21HMAIN ENDP,例6.9,;十六进制输入并转换为十六进制数值子程序,十六进制数值在BX中HEXIBINPROC MOV BX,0 NEWCHAR:MOV AH,KEY_ININT DOSCALLSUB AL,30HJL EXIT;非十六进制数值输入则结束输入CMP AL,10JL ADD_TOSUB AL,27HCMP AL,10HJGE EXITADD_TO:SHL BX,CL;新输入的数值(在AL的低四位上)加入到BX的低四位中MOV AH,0ADD BX,AXJMP

19、NEWCHAREXIT:RETHEXIBINENDP,例6.9,;十六进制到十进制转换并显示子程序;被除数是BX,除数分别是10000,1000,100,10,1,;;商是十进制;数,余数作为下次的被除数BINIDECPROCMOV CX,10000DCALL DEC_DIVMOV CX,1000DCALL DEC_DIVMOV CX,100DCALL DEC_DIVMOV CX,10DCALL DEC_DIVMOV CX,1CALL DEC_DIVRETBINIDECENDP,DEC_DIVPROCMOV AX,BXMOV DX,0DIV CXMOV BX,DXMOV DL,ALADD DL

20、,30HMOV AH,DISPINT DOSCALLRETDEC_DIVENDP,例6.9,CRLFPROCMOV DL,0AHMOV AH,DISPINT DOSCALLMOV DL,0DHMOV AH,DISPINT DOSCALLRETCRLFENDPCSEG ENDSEND MAIN,例6.10 一个简单的信息检索系统,数据区里有10个不同的信息,编号为0-9,每个信息包括30个字符。编制程序从键盘接收0-9之间的编号,然后在屏幕上显示相应编号的信息内容。(6-10.asm,6-10.doc),SSEG SEGMENT PARA STACK stackDW 100H DUP(0)SSE

21、G ENDS DSEG SEGMENT PARA DataTHIRTYDB?MESG0DB This is message 0-MESG1DB This is message 1-MESG2DB This is message 2-MESG3DB This is message 3-MESG4DB This is message 4-MESG5DB This is message 5-MESG6DB This is message 6-MESG7DB This is message 7-MESG8DB This is message 8-MESG9DB This is message 9-LE

22、NEQU MESG1-MESG0ERRMSGDB error!invilid parameter!DSEG ENDS,例6.10:1/3,CSEG SEGMENT PARA CODEASSUME CS:CSEG,DS:DSEG,SS:SSEGMAIN PROC FARMOV AX,DSEGMOV DS,AXMOV THIRTY,LENBEGIN:MOV AH,1INT 21HSUB AL,0JC ERRORCMP AL,9JA ERRORPUSH AXMOV DL,0AHCALL DISPCHARMOV DL,0DHCALL DISPCHARPOP AX,MOV BX,OFFSET MESG0

23、MUL THIRTYADD BX,AXCALL DISPJMP BEGINERROR:MOV BX,OFFSET ERRMSGCALL DISPMOV AX,4C00HINT 21H,例6.10:2/3,DISPPROCMOV CX,30DISP1:MOV DL,BXCALL DISPCHARINC BXLOOP DISP1MOV DL,0AHCALL DISPCHARMOV DL,0DHCALL DISPCHARRETDISPENDP DISPCHARPROCMOV AH,2INT 21HRET DISPCHARENDPMAIN ENDPCSEGENDSEND MAIN;SET ENTRY

24、POINT,例6.10:3/3,例6.11 人名排序程序。从键盘键入最多30个人名,当所有人名都进入后,按字母上升的次序将人名排序,并在屏幕上显示已排序后的人名(6-11),b10read:输入子程序(所占空间固定,但要将多出部分清为空格)D10stor:将本次输入存储到表中(DI中是在表中起始地址的指针,同时计存储到表中的名字的个数)g10sort:排序(冒泡排序)H10 xch:交换表中相邻项的顺序 K10disp:显示已排序的名字表 Q10clr:清屏 Q20curs:设置光标位置,DSEG SEGMENT PARA DATA NAMEPARLABEL BYTE MAXLENDB 21

25、NAMELENDB?NAMEFLDDB 21 DUP(?)CRLFDB 13,10,$ENDADDRDW?MESG1DB NAME?,$NAMECTRDB 0 NAMETABDB 20 DUP(20 DUP()NAMESAVDB 20 DUP(?),13,10,$SWAPPEDDB 0DSEG ENDSCSEG SEGMENT PARA CODEASSUME CS:CSEG,DS:DSEGMAIN PROC FARMOV AX,DSEGMOV DS,AXMOV ES,AX,例6.11:1/6,CLDLEA DI,NAMETAB;表首址作为目的串的首址CALL Q10CLRCALL Q20CUR

26、S A20LOOP:CALL B10READ;调输入子程序CMP NAMELEN,0JZ A30CALL D10STOR;存储JMP A20LOOPA30:CALL Q10CLRCALL Q20CURSCMP NAMECTR,1JBE A40CALL G10SORTA40:CMP NAMECTR,0JBE EXITCALL K10DISPEXIT:MOV AX,4C00HINT 21HMAIN ENDP,例6.11:2/6,;名字输入子程序 B10READPROCMOV AH,9LEA DX,MESG1INT 21HMOV AH,0AHLEA DX,NAMEPARINT 21HMOV AH,9

27、LEA DX,CRLFINT 21HMOV BH,0;缓存区的空余部分填空格MOV BL,NAMELENMOV CX,21SUB CX,BXB20:MOV NAMEFLDBX,20HINC BXLOOP B20RET B10READENDP,;名字存储子程序 D10STORPROC;名字个数计数器加1INC NAMECTRCLDLEA SI,NAMEFLDMOV CX,10REP MOVSWRET D10STORENDP,例6.11:3/6,;排序子程序 G10SORTPROCSUB DI,40MOV ENDADDR,DIG20:MOV SWAPPED,0;交换标志清0LEA SI,NAMET

28、ABG30:MOV CX,20MOV DI,SIADD DI,20MOV AX,DIMOV BX,SIREPE CMPSBJBE G40CALL H10XCH;调用交换顺序子程序G40:MOV SI,AXCMP SI,ENDADDRJBE G30CMP SWAPPED,0JNZ G20RET G10SORTENDP,例6.11:4/6,;交换表的内容H10XCHPROCMOV CX,10LEA DI,NAMESAVMOV SI,BXREP MOVSWMOV CX,10MOV DI,BXREP MOVSWMOV CX,10LEA SI,NAMESAVREP MOVSWMOV SWAPPED,1R

29、ETH10XCHENDP,;显示已排序的名字表 K10DISPPROCLEA SI,NAMETABK20:LEA DI,NAMESAVMOV CX,10REP MOVSWMOV AH,9LEA DX,NAMESAVINT 21HDEC NAMECTRJNZ K20RET K10DISPENDP,例6.11:5/6,;清屏子程序Q10CLRPROCMOV AX,0600HMOV BH,61HSUB CX,CXMOV DX,184FHINT 10HRETQ10CLRENDP;设置光标位置子程序 Q20CURSPROCMOV AH,2SUB BH,BHSUB DX,DXINT 10HRET Q20C

30、URSENDPCSEG ENDSEND MAIN;SET ENTRY POINT,例6.11:6/6,6.4 DOS系统功能调用,系统功能调用,21H号中断是DOS提供给用户的用于调用系统功能的中断,它有近百个功能供用户选择使用,主要包括设备管理、目录管理和文件管理三个方面的功能ROM-BIOS也以中断服务程序的形式,向程序员提供系统的基本输入输出程序汇编语言程序设计需要采用系统的各种功能程序充分利用操作系统提供的资源是程序设计的一个重要方面,需要掌握,功能调用的格式,通常按照如下4个步骤进行:在AH寄存器中设置系统功能调用号在指定寄存器中设置入口参数执行指令INT 21H(或ROM-BIOS

31、的中断向量号)实现中断服务程序的功能调用根据出口参数分析功能调用执行情况,字符输出的功能调用,DOS功能调用INT 21H功能号:AH02H入口参数:DL字符的ASCII码功能:在显示器当前光标位置显示给定的字符,光标右移一个字符位置。如按Ctrl-Break或Ctrl-C则退出,;在当前显示器光标位置显示一个问号MOV AH,02H;设置功能号:AH02HMOV DL,?;提供入口参数:DL?INT 21H;DOS功能调用:显示,字符串输出的功能调用,DOS功能调用INT 21H功能号:AH09H入口参数:DS:DX欲显示字符串在主存中的首地址字符串应以$(24H)结束功能:在显示器输出指定

32、的字符串可以输出回车(0DH)和换行(0AH)字符产生回车和换行的作用,字符串输出的功能调用显示字符串(例),STR DB Hello,Everybody!,0DH,0AH,$;在数据段定义要显示的字符串.MOV AH,09H;设置功能号:AH09HMOV DX,OFFSET STR;提供入口参数:DX字符串的偏移地址INT 21H;DOS功能调用:显示,字符输入的功能调用,DOS功能调用INT 21H功能号:AH01H出口参数:AL字符的ASCII码功能:获得按键的ASCII代码值调用此功能时,若无键按下,则会一直等待,直到按键后才读取该键值,字符输入的功能调用判断按键(例),GETKEY:

33、MOV AH,01H;功能号:AH01HINT 21H;功能调用CMP AL,Y;处理出口参数ALJE YESKEY;是“Y”CMP AL,NJE NOKEY;是“N”JNE GETKEY.YESKEY:.NOKEY:.,字符串输入的功能调用,DOS功能调用INT 21H功能号:AH0AH入口参数:DS:DX缓冲区首地址执行该功能调用时,用户按键,最后用回车确认本调用可执行全部标准键盘编辑命令;用户按回车键结束输入,如按CtrlBreak或CtrlC则中止,关键要定义好缓冲区,字符串输入的功能调用缓冲区的定义,第1字节事先填入最多欲接收的字符个数(包括回车字符,可以是1255)第2字节将存放实际输入的字符个数(不包括回车符)第3字节开始将存放输入的字符串实际输入的字符数多于定义数时,多出的字符丢掉,且响铃接收的字符串最后一个总是回车符,字符串输入的功能调用输入字符串(例),;定义缓冲区BUFDB 81;第1个字节填入可能输入的最大字符数DB 0;存放实际输入的字符数DB 81 DUP(0);存放输入的字符串.MOV DX,SEG BUF;伪指令SEG取得BUFFER的段地址MOV DS,DX;设置数据段DSMOV DX,OFFSET BUFMOV AH,0AHINT 21H,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号