六章子程序结构.ppt
《六章子程序结构.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
2、ptr label ;段间调用、直接寻址 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出栈
3、IPSS:SP,SPSP2 CSSS:SP,SPSP2,一、子程序指令返回指令RET的参数,RET i16 ;有参数返回 RET指令可以带有一个立即数i16,则堆栈指针SP将增加,即 SPSP+i16 这个特点使得程序可以方便地废除若干执行CALL指令以前入栈的参数,二、子程序的调用与返回,二、子程序的调用与返回 书写形式(同一代码段内),二、子程序的调用与返回 书写形式(不同代码段),三、现场的保护与恢复,现场:主程序转向子程序之前,其所使用的一些资源的状态(如标志位、R/M等) 子程序与主程序分别编制,通常会导致使用的资源发生冲突而影响主程序在调用子程序之后的正确执行 方法:利用堆栈 在主
4、程序中进行 在子程序中进行,三、现场的保护与恢复 在主程序中进行, PUSH BX PUSH AX CALL SUB1 POP AX POP BX ,注意: 进栈/出栈的顺序,保护与恢复的对象: 主程序用到的存有数据、中间结果且在CALL指令后还要用到的R/M,三、现场的保护与恢复 在子程序中进行,SUB1 PROC PUSH BX PUSH AX POP AX POP BX RET SUB1 ENDP,注意: 进栈/出栈的顺序,保护与恢复的对象: 子程序用到的R/M,四、子程序参数的传递,入口参数(输入参数):主程序提供给子程序 出口参数(输出参数):子程序返回给主程序 参数的形式: 数据本
5、身(传值) 数据的地址(传址) 传递的方法: 寄存器 变量 堆栈,例:将两个给定的二进制数转换成为二进制数的ASCII 码形式并加以显示,对两个数进行转换、显示的工作是相同的,没有必要重复编写,以子程序的形式来完成,例:将两个给定的二进制数转换成为二进制数的ASCII码形式并加以显示(6-1-1.asm),方法一:用寄存器传递参数,;转换子程序 BINASC PROC REP1: ROL BX,1 MOV DL,BL AND DL,01H ADD DL,30H ;屏蔽除最低位外的其他位 MOV DI,DL INC DI LOOP REP1 RET BINASC ENDP,;显示子程序 DISP
6、 PROC REP2: MOV AH,2 MOV DL,DI INT 21H INC DI LOOP REP2 MOV DL,0AH ;设置显示后的光标位置 MOV AH,2 INT 21H MOV DL,0DH MOV AH,2 INT 21H RET DISP ENDP,DSEG SEGMENT PARA DATA BIN1 DB 35H BIN2 DW 0AB48H ASCBUF DB 20H DUP(?) DSEG ENDS CSEG SEGMENT PARA CODE ASSUME CS:CSEG, DS:DSEG,SS:SSEG MAIN PROC FAR MOV AX,DSEG
7、MOV DS,AX MOV BH,BIN1 MOV CX,8 LEA DI,ASCBUF PUSH DI PUSH CX CALL BINASC POP CX POP DI PUSH DI CALL DISP POP DI ADD DI,10H MOV BX,BIN2 MOV CX,16 PUSH DI PUSH CX CALL BINASC POP CX POP DI CALL DISP MOV AX,4C00H INT 21H,;转换子程序 BINASC PROC REP1: ROL BX,1 MOV DL,BL AND DL,01H ADD DL,30H ;屏蔽除最低位外的其他位 MOV
8、 DI,DL INC DI LOOP REP1 RET BINASC ENDP ;显示子程序 DISP PROC REP2: MOV AH,2 MOV DL,DI INT 21H INC DI LOOP REP2 MOV DL,0AH ;设置显示后的光标位置 MOV AH,2 INT 21H MOV DL,0DH MOV AH,2 INT 21H RET DISP ENDP MAIN ENDP CSEG ENDS END MAIN ;set entry point,例:将两个给定的二进制数转换成为二进制数的ASCII码形式并加以显示(6-1-2.asm),方法二:用堆栈传递参数,方法二之主程序
9、段 MOV AH,BIN1 ;要转换的数进栈 PUSH AX LEA DI,ASCBUF ;地址指针 PUSH DI MOV AX,8 ;长度 PUSH AX CALL BINASC ;调用转换子程序 MOV AX,BIN2 PUSH AX ADD DI,10H PUSH DI MOV AX,16 PUSH AX CALL BINASC,;转换并显示子程序 BINASC PROC PUSH DI PUSH AX PUSH BX PUSH CX PUSH DX PUSH BP MOV BP,SP MOV BX,BP+18 MOV DI,BP+16 MOV CX,BP+14 REP1: ROL B
10、X,1 MOV DL,BL AND DL,01H ;屏蔽除最低位外的其他位 ADD DL,30H MOV DI,DL MOV AH,6 INT 21H INC DI LOOP REP1,MOV AH,6 MOV DL,0AH INT 21H MOV AH,6 MOV DL,0DH INT 21H POP BP POP DX POP CX POP BX POP AX POP DI RET 6 BINASC ENDP,方法二之堆栈,6.2 嵌套与递归子程序,嵌套:子程序调用其他子程序,嵌套层数取决于堆栈的大小32K(基本不受限制) 递归:子程序调用自己,该情况要合理设置出口参数,否则会造成程序死锁
11、,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 STACK DW 100H DUP(0) SSEG ENDS DSEG SEGMENT PARA DATA DSEG ENDS CSEG SEGMENT PARA COD
12、E ASSUME CS:CSEG, DS:DSEG,SS:SSEG MAIN PROC FAR MOV AX,DSEG ;MAKE NECCESSARY INITALIZALITION MOV DS,AX REPEAT: CALL DECIBIN CALL CRLF CALL BINIHEX CALL CRLF JMP REPEAT MOV AH,0AH INT 21H MOV AX,4C00H ;RETURN DOS INT 21H MAIN ENDP,;从键盘获得十进制数并将其转换成十六进制数置于BX中 DECIBIN PROC MOV BX,0 NEWCHAR: MOV AH,1 INT
13、 21H SUB AL,30H JL EXIT ;非十进制数则退出 CMP AL,9 JG EXIT CBW XCHG AX,BX ;将原有的数*10后加新输入的数 MOV CX,10 MUL CX XCHG AX,BX ADD BX,AX JMP NEWCHAR EXIT: RET DECIBIN ENDP,;将BX中的十六进制数转换成相应的ASCII码显示在屏幕上 BINIHEX PROC MOV CH,4 ;共四位十六进制数 ROTATE: MOV CL,4 ROL BX,CL MOV AL,BL ;从最高位开始,将其移位至BX,AL的低4位 AND AL,0FH ADD AL,30H
14、CMP AL,3AH JL PRINTIT ADD AL,7 ;如为A-F的处理 PRINTIT: MOV DL,AL MOV AH,2 INT 21H DEC CH JNZ ROTATE RET BINIHEX ENDP,CRLF PROC MOV DL,0AH MOV AH,2 INT 21H MOV DL,0DH MOV AH,2 INT 21H RET CRLF ENDP CSEG ENDS END MAIN ;SET ENTRY POINT,例 6.8 把以ASCII码形式表示的十进制数转换成二进制数(6-8-2.asm,6-8-1.asm增强型编程),程序限制:转换后的二进制数不超
15、过16位 转换方法:12345,从最低位开始,增强功能的过程定义伪操作,格式: PROCNAME PROC ATTRIBUTES FIELD USES REGISTER LIST ,PARAMETER FIELD PROCNAME ENDP ATTRIBUTES FIELD : DISTANCE LANGUAGE TYPE VISIBILITY PROLOGUE,增强功能的过程定义伪操作,例6.8,.MODEL SMALL .STACK 64 .DATA ASCVAL DB 12345 BINVAL DW ? .CODE MAIN PROC FAR MOV AX,DATA MOV DS,AX
16、LEA BX,ASCVAL PUSH BX LEA BX,BINVAL PUSH BX CALL CONVASCBIN MOV BX,BINVAL CALL BINIHEX MOV AX,4C00H INT 21H MAIN ENDP,CONVASCBIN PROC PASCAL USES AX BX CX SI DI,PAR1:WORD,PAR2:WORD LOCAL ASCLEN:WORD,MULFACT:WORD MOV BX,10 MOV SI,PAR1 MOV DI,PAR2 SUB DI,SI MOV ASCLEN,DI MOV CX,DI ADD SI,CX DEC SI MOV
17、 MULFACT,1 MOV DI,PAR2 MOV WORD PTR DI,0 NEXT: MOV AL,SI AND AX,000FH MUL MULFACT ADD DI,AX MOV AX,MULFACT MUL BX MOV MULFACT,AX DEC SI LOOP NEXT RET CONVASCBIN ENDP,BINIHEX PROC MOV CH,4 ROTATE: MOV CL,4 ROL BX,CL MOV AL,BL AND AL,0FH ADD AL,30H CMP AL,3AH JL PRINTIT ADD AL,7 PRINTIT: MOV DL,AL MOV
18、 AH,2 INT 21H DEC CH JNZ ROTATE RET BINIHEX ENDP END MAIN ;SET ENTRY POINT,例:6.9 十六进制到十进制数的转换,把从键盘输入的0-FFFF的十六进制正数转换成十进制数并在屏幕上显示出来 Hexibin :键盘输入十六进制数其数值在BX中 crlf :回车换行 Binidec:十六进制到十进制转换并显示,例6.9,DISP EQU 2H KEY_IN EQU 1H DOSCALL EQU 21H SSEG SEGMENT PARA STACK STACK DW 100H DUP(0) SSEG ENDS CSEG SEG
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 章子 程序结构
链接地址:https://www.31doc.com/p-2592236.html