《ibmpc80x86汇编语言程序设计》ppt电子课件教案第六章子程序设计

上传人:aa****6 文档编号:54722812 上传时间:2018-09-18 格式:PPT 页数:69 大小:140KB
返回 下载 相关 举报
《ibmpc80x86汇编语言程序设计》ppt电子课件教案第六章子程序设计_第1页
第1页 / 共69页
《ibmpc80x86汇编语言程序设计》ppt电子课件教案第六章子程序设计_第2页
第2页 / 共69页
《ibmpc80x86汇编语言程序设计》ppt电子课件教案第六章子程序设计_第3页
第3页 / 共69页
《ibmpc80x86汇编语言程序设计》ppt电子课件教案第六章子程序设计_第4页
第4页 / 共69页
《ibmpc80x86汇编语言程序设计》ppt电子课件教案第六章子程序设计_第5页
第5页 / 共69页
点击查看更多>>
资源描述

《《ibmpc80x86汇编语言程序设计》ppt电子课件教案第六章子程序设计》由会员分享,可在线阅读,更多相关《《ibmpc80x86汇编语言程序设计》ppt电子课件教案第六章子程序设计(69页珍藏版)》请在金锄头文库上搜索。

1、第六章 子程序设计,一、子程序的定义 二、子程序的结构形式 三、子程序的设计和调用 四、子程序的参数传递方法 五、子程序的嵌套和递归调用 六、子程序的设计举例 七、多模块程序设计 八、汇编语言和高级语言的混合编程,一、子程序的定义,1、子程序的概念和特点 2、子程序的定义 3、子程序的调用和返回,1、子程序的概念和特点,子程序:把在程序中多次出现,具有独立功能的程序段写成程序模块,该模块可被多次调用,称之为子程序。,特点:可重复使用(调用)具有通用性(可通过入口参数实现)可浮动性(存放位置灵活)可递归性和可重入性,子程序的定义是由过程定义伪指令PROC和ENDP来完成的。其格式如下: 过程名

2、PROC NEAR/FAR 过程名 ENDP 其中PROC表示过程定义开始,ENDP表示过程定义结束。过程名是过程入口地址的符号表示。 一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性。,2、子程序的定义,3、子程序的调用和返回,调用 段内直接调用 格式:CALL 子程序名 功能:将子程序返回地址(断点)入栈SPSP-2 (SP)IP,并转到子程序入口地址去执行子程序。IPIP+(子程序入口地址与CALL之间的偏移量),例:段内直接调用,显示字符P CODE SEGMENTASSUME CS:CODE START:CALL DISPMOV AH,4CHINT 21H DI

3、SP PROCMOV DL,PMOV AH,2INT 21HRET,DISP ENDP CODE ENDSEND START,段内间接调用 格式:CALL DST 或CALL WORD PTR DST (DST为寄存器或字存储器) 功能:断点入栈,转子程序执行。 SPSP-2 (SP)IP IP(EA) 例: CALL BXCALL WORD PTR SI,段间直接调用 格式:CALL FAR PTR DST(DST为子程序名) 功能:段点(CS和IP)入栈,并转到子程序处执行。 SPSP-2 (SP)CS SPSP-2 (SP)IP IP子程序入口地址的偏移地址 CS子程序入口地址的段地址,

4、例: 段内间接调用,显示一个字符P CODE1 SEGMENTASSUME CS:CODE1 START:CALL DISPMOV AH,4CHINT 21H CODE1 ENDS CODE2 SEGMENTASSUME CS:CODE2,DISP PROC FARMOV DL,PMOV AH,2INT 21HRET DISP ENDP CODE2 ENDSEND START,段间间接调用 例:CALL DWORD PTR BXCALL DWORD PTR ADDR,返回指令 格式: RET 功能:返回堆栈中存放的断点,并返回到CALL指令的后续指令继续执行。,二、子程序的结构形式,子程序设计

5、考虑四部分: 保护现场(保存寄存器原有的内容)、处理部分、恢复现场(恢复寄存器原有的内容)、子程序的返回。,“现场”:子程序执行中要用到的寄存器。 保护现场:一般通过压栈实现(进入子程序前) 恢复现场:一般通过出栈实现(返回子程序前),1、子程序的调用方法说明,(1)子程序名:供调用时使用 (2)入口参数:子程序执行需要的数据 (3)出口参数(输出参数):说明子程序执行后结果存放在何处。 (4)占用寄存器:说明子程序执行时需要使用那些寄存器。那些改变,那些不变。,注意:作为存放出口参数用的寄存器不能保护。,2信息的保护与恢复,例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则可

6、采用如下方法保护和恢复现场。 PROG PROCPUSH AXPUSH BX PUSH CX ;保护现场PUSH DX, POP OP CXPOP BX ;恢复现场POP AXRET ;返回断点处 PROC ENDP,三、子程序的设计和调用举例 例6-2 多字节二进制数加法子程序,;子程序名:MBTADD ;功能:两个多字节二进制相加 ;入口参数:SI,DI分别存放两个数的首地址,BX存放和的首地址,CX存放多字节数的长度。 ;出口参数:BX存放和的首地址,MBTADD PROC PUSH SIPUSH DIPUSH BXPUSH AXPUSH CXCLC ;CF=0,保护现场,NEXT:MO

7、V AL,SIADC AL,DIMOV BX,ALINC SIINC DIINC BXLOOP NEXTPOP CXPOP AXPOP BXPOP DI,POP SI RET MBTADD ENDP,返回现场,例:求最大公约数子程序。 入口参数:AX,BX 出口参数:CX MCDST PROCPUSH AXPUSH BXPUSH DX AGAIN:XOR DX,DXDIV BXAND DX,DXJZ EXIT,MOV AX,BXMOV BX,DXJMP AGAIN EXIT:MOV CX,BXPOP OP BXPOP AXRET MCDST ENDP,例6-3:将在BUFFER为首地址的缓冲区

8、的一个字符串中的所有大写字母都转换成小写字母,并在屏幕显示出来。,程序清单如下:DATA SEGMENTORG 200HSTRING DB ABsDFAIViop STRLEN EQU $-STRING ;字符串长度DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATA ;设置数据段MOV DS,AX,MOV SI,OFFSET STRING;取串首地址赋给SIMOV CX,STRLEN ;串长送CXCALL STRDTX;调用子程序MOV DX,OFFSET STRING;打印转换后的字符串MOV AH,9INT 21HM

9、OV AH,4CHINT 21H,;大小写转换子程序STRDTX PROC NEAR PUSH AXPUSH CXPUSH SINEXT:MOV AL,SICMP CX,0 JZ EXIT CMP AL,A JB NEXT1CMP AL,Z,JA NEXT1ADD AL,20H MOV SI,AL NEXT1:INC SI JMP NEXT EXIT: POP SI POP CXPOP AX RET STRDTX ENDP CODE ENDSEND START,四、主程序与子程序参数传递方式,通过寄存器传递参数 通过堆栈传递参数 通过存储单元传递参数,1、通过寄存器传递参数,主程序将原始参数放

10、入约定的寄存器,然后调用子程序;子程序把处理结果放入约定的寄存器,并返回主程序。,例6-5数据块传送子程序,分析: 入口参数:源操作块首地址、目的块首地址和块长度。分别用SI、DI和CX来传递参数。,DATA SEGMENTBLOCK1 DB 23H,45H,13H,2FH,1AH,94HLENS EQU $-BLOCK1BLOCK2 DB LENS DUP(?) DATA ENDS CODE SEGMENTASSUME CS:CODE, DS:DATA START:MOV AX,DATAMOV DS, AX,MOV SI,OFFSET BLOCK1MOV DI,OFFSET BLOCK2MO

11、V CX, LENSCALL MOVSTOKMOV AH,4CHINT 21H MOVSTOK PROC NEARPUSH AX NEXT: MOV AL,SIMOV DI,ALINC SI,INC DILOOP NEXTPOP AXRET MOVSTOK ENDP CODE ENDS END START,例: 在ADRM和ADRN单元中分别存放两个正整数M、N,求最大公约数,并将结果存入RESULT单元中。,入口参数:AX,BX 出口参数:CX,算法: (1)判断如MN,转(2),否则交换M、N (2)M/N得到余数R (3)判断若R=0,则N为最大公约数,否则 (4)更新被除数和除数,MN

12、,NR,转(2)执行。,2、通过堆栈传递参数,主程序的入口参数用堆栈保存,不占用存储单元,在子程序中弹出入口参数,执行完子程序后,释放堆栈空间。,例6-5用堆栈传递参数,实现数据块传送。,入口参数:源数据块首地址,目的数据块首地址及数据块长度。均用寄存器AX把3个参数压栈。,DATA SEGMENTBLOCK1 DB 23H,45H,13H,2FH,1AH,94HLENS EQU $-SOUCEBLOCK2 DB LENS DUP(?) DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AX,MOV AX,

13、OFFSET BLOCK1PUSH AXMOV AX, OFFSET BLOCK2PUSH AXMOV AX, LENSPUSH AXCALL MOVSTOKMOV AH,4CHINT 21H,MOVSTOK PROC NEARPUSH SIPUSH DIPUSH CXPUSH BPMOV BP,SPMOV SI,BP+14 MOV DI,BP+12MOV CX,BP+10,LOP1:MOV AL,SIMOV DI,ALINC SIINC DI LOOP LOP1 RET MOVSTOK ENDP CODE ENDSEND START,例:利用堆栈传递参数,实现对2个已定义数组分别求和。主程序

14、与子程序不在同一代码段中。,入口参数:数组的首地址和数组长度。使用寄存器AX将入口参数压栈。,DATA SEGMENTARYA DB 06H,33H,0AH,88H,13HSUMA DW ?ARYB DB 9FH,97H,34H,22H,33,13HSUMB DW ? DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AX,MOV AX,SUMA-ARYAPUSH AXMOV AX,OFFSET ARYAPUSH AXCALL SUMMOV AX,SUMB-ARYBPUSH AXMOV AX,OFFSET ARYBPUSH AXCALL SUM,MOV AH,4CHINT 21H CODE ENDS,PROCE SEGMENTASSUME CS:PROCE,DS:DATA SUM PROC FARPUSH AXPUSH BXPUSH CXPUSH BPMOV BP,SPPUSHFMOV CX,BP+14MOV BX,BP+12,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号