子程序结构课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《子程序结构课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 子程序 结构 课件
- 资源描述:
-
1、1第六章 子程序结构6.1 子程序的设计方法6.2 嵌套与递归子程序6.3 子程序举例6.4 DOS系统功能调用26.1 子程序的设计方法一、子程序指令二、子程序的调用与返回三、现场的保护与恢复四、子程序参数的传递3一、子程序指令w 子程序是完成特定功能的一段程序w 当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行w 当运行完子程序功能后,采用RET返回指令回到主程序继续执行4一、子程序指令调用指令w CALL指令分成4种类型(类似JMP)nCALL label;段内调用、直接寻址nCALL r16/m16;段内调用、间接寻址nCALL far ptr l
2、abel;段间调用、直接寻址nCALL far ptr mem;段间调用、间接寻址w CALL指令需要保存返回地址:n段内调用偏移地址IP入栈 SPSP2,SS:SPIPn段间调用偏移地址IP和段地址CS入栈 SPSP2,SS:SP CS SPSP2,SS:SP IP5一、子程序指令返回指令w 根据段内和段间、有无参数,分成4种类型nRET;无参数段内返回nRET i16;有参数段内返回nRET;无参数段间返回nRET i16;有参数段间返回w 需要弹出CALL指令压入堆栈的返回地址n段内返回偏移地址IP出栈 IPSS:SP, SPSP2n段间返回偏移地址IP和段地址CS出栈 IPSS:SP,
3、SPSP2 CSSS:SP,SPSP26一、子程序指令返回指令RET的参数RET i16;有参数返回wRET指令可以带有一个立即数i16,则堆栈指针SP将增加,即SPSP+i16w这个特点使得程序可以方便地废除若干执行CALL指令以前入栈的参数7二、子程序的调用与返回CALL label主程序RET子程序回到CALL指令后的指令处返回地址8二、子程序的调用与返回书写形式(同一代码段内)9二、子程序的调用与返回书写形式(不同代码段)10三、现场的保护与恢复w 现场:主程序转向子程序之前,其所使用的一些资源的状态(如标志位、R/M等)w 子程序与主程序分别编制,通常会导致使用的资源发生冲突而影响主
4、程序在调用子程序之后的正确执行w 方法:利用堆栈n在主程序中进行n在子程序中进行11三、现场的保护与恢复在主程序中进行PUSH BXPUSH AXCALL SUB1POP AXPOP BX注意: 进栈/出栈的顺序保护与恢复的对象:主程序用到的存有数据、中间结果且在CALL指令后还要用到的R/M12三、现场的保护与恢复在子程序中进行SUB1 PROCPUSH BXPUSH AXPOP AXPOP BXRETSUB1 ENDP注意: 进栈/出栈的顺序保护与恢复的对象:子程序用到的R/M13四、子程序参数的传递w 入口参数(输入参数):主程序提供给子程序w 出口参数(输出参数):子程序返回给主程序w
5、 参数的形式: 数据本身(传值) 数据的地址(传址)w 传递的方法: 寄存器 变量 堆栈14例:将两个给定的二进制数转换成为二进制数的ASCII 码形式并加以显示w 对两个数进行转换、显示的工作是相同的,没有必要重复编写,以子程序的形式来完成w显示子程序需被告知:被显示内容的起始位置被显示内容的长度被转换的数及其长度存放结果的起始位置w转换子程序需被告知:15例:将两个给定的二进制数转换成为二进制数的ASCII码形式并加以显示(6-1-1.asm)w 方法一:用寄存器传递参数w显示子程序:DI:被显示内容的起始位置指针CX:被显示内容的长度BX:被转换的数CX:被转换数的长度DI:存放结果的起
6、始位置指针w转换子程序:16;转换子程序 BINASCPROC REP1:ROL BX,1MOV DL,BLAND DL,01HADD DL,30H;屏蔽除最低位外的其他位MOV DI,DLINC DILOOP REP1RET BINASCENDPBLBHDLDI17;显示子程序DISPPROCREP2:MOV AH,2MOV DL,DIINT 21HINC DILOOP REP2MOV DL,0AH;设置显示后的光标位置MOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HRETDISP ENDP18DSEG SEGMENT PARA DATABIN1DB 35HB
7、IN2 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,10HMOV BX,BIN2MOV CX,16PUSH DIPUSH CXCALL BINASCPOP CXPOP DICALL DISPMOV AX,
8、4C00HINT 21H;转换子程序BINASCPROCREP1:ROL BX,1MOV DL,BLAND DL,01HADD DL,30H;屏蔽除最低位外的其他位MOV DI,DLINC DILOOP REP1RETBINASCENDP;显示子程序DISP PROCREP2:MOV AH,2MOV DL,DIINT 21HINC DILOOP REP2MOV DL,0AH;设置显示后的光标位置MOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HRETDISP ENDPMAIN ENDPCSEG ENDSEND MAIN ;set entry point19例:将两
9、个给定的二进制数转换成为二进制数的ASCII码形式并加以显示(6-1-2.asm)w 方法二:用堆栈传递参数20方法二之主程序段MOV AH,BIN1;要转换的数进栈PUSH AXLEA DI,ASCBUF;地址指针PUSH DIMOV AX,8;长度PUSH AXCALL BINASC;调用转换子程序MOV AX,BIN2PUSH AXADD DI,10HPUSH DIMOV AX,16PUSH AXCALL BINASC21;转换并显示子程序BINASCPROCPUSH DIPUSH AXPUSH BXPUSH CXPUSH DXPUSH BPMOV BP,SPMOV BX,BP+18MO
10、V DI,BP+16MOV CX,BP+14REP1:ROL BX,1MOV DL,BLAND DL,01H ;屏蔽除最低位外的其他位ADD DL,30HMOV DI,DLMOV AH,6INT 21HINC DILOOP REP1MOV AH,6MOV DL,0AHINT 21HMOV AH,6MOV DL,0DHINT 21HPOP BPPOP DXPOP CXPOP BXPOP AXPOP DIRET 6BINASC ENDP22BP=SPBX地址IP长度进入子程序时的SPAXDIBIN1CXDXBPBP+14BP+16BP+18方法二之堆栈236.2 嵌套与递归子程序w 嵌套:子程序调
11、用其他子程序,嵌套层数取决于堆栈的大小32K(基本不受限制)w 递归:子程序调用自己,该情况要合理设置出口参数,否则会造成程序死锁246.3 子程序举例25例 6.3 十进制到十六进制数的转换(从键盘取得一个十进制数,然后把该数以十六进制的形式在屏幕上显示出来)26例 6.3 十进制到十六进制数的转换(6-3-1.DOC)w 转换方法:1234(0*10+1)*10)+2)*10+3)*10+4从最高位开始:累加和*10+本位的权值w 十六进制数显示的实现BHH4BHL4BLH4BLL44BHH4BHL4BLH4BLL4BHH4AL从最高位开始27;例6-3,十进制到十六进制数的转换SSEG
12、SEGMENT PARA STACK STACKDW 100H 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 DOSIN
13、T 21HMAIN ENDP28;从键盘获得十进制数并将其转换成十六进制数置于BX中DECIBIN PROCMOV 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:RETDECIBIN ENDP29;将BX中的十六进制数转换成相应的ASCII码显示在屏幕上BINIHEX PROC MOV CH,4;共四位十六进制数ROTATE: MOV CL,4ROL
14、 BX,CLMOV AL,BL;从最高位开始,将其移位至BX,AL的低4位AND AL,0FHADD AL,30HCMP AL,3AHJL PRINTITADD AL,7;如为A-F的处理PRINTIT: MOV DL,ALMOV AH,2INT 21HDEC CHJNZ ROTATERETBINIHEX ENDPCRLFPROCMOV DL,0AHMOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HRETCRLFENDPCSEG ENDSEND MAIN ;SET ENTRY POINT30例 6.8 把以ASCII码形式表示的十进制数转换成二进制数(6-8-2.
15、asm,6-8-1.asm增强型编程)w 程序限制:转换后的二进制数不超过16位w 转换方法:123455*1= 5 5*01H= 5H4*10 = 404*0AH= 28H3*100= 3003*64H= 12CH2*1000= 20002*3E8H= 7D0H1*10000= 100001*2710H=2710H求和= 12345求和=3039H从最低位开始31增强功能的过程定义伪操作格式:PROCNAMEPROC ATTRIBUTES FIELD USES REGISTER LIST ,PARAMETER FIELDPROCNAMEENDPATTRIBUTES FIELD :DISTAN
16、CE LANGUAGE TYPE VISIBILITYPROLOGUE32增强功能的过程定义伪操作33例6.8.MODEL SMALL.STACK 64.DATAASCVAL DB 12345BINVALDW ?.CODEMAIN PROC FARMOV AX,DATAMOV DS,AXLEA BX,ASCVALPUSH BXLEA BX,BINVALPUSH BXCALL CONVASCBINMOV BX,BINVALCALL BINIHEXMOV AX,4C00HINT 21HMAIN ENDP34CONVASCBINPROC PASCAL USES AX BX CX SI DI,PAR1
17、: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 AL,SIAND AX,000FHMUL MULFACTADD DI,AXMOV AX,MULFACTMUL BXMOV MULFACT,AXDEC SILOOP NEXTRETCONVASCBINENDP35BINIHEX PROC MOV CH,4RO
展开阅读全文