文档详情

汇编语言程序设计 第06章:子程序结构.ppt

发布:2017-06-19约7.67千字共29页下载文档
文本预览下载声明
第六章 子程序结构 6 子程序结构 在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列 解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用 在汇编语言中,子程序又称过程 子程序:功能和结构相同,只是某些变量得值有所不同 调用子程序的程序称为主调程序或主程序 6 子程序结构 子程序的基本结构包括以下几个部分: (1)子程序定义 (2)保护现场和恢复现场 (3)子程序体 (4)子程序返回 6.1 子程序的设计方法 6.1.1 过程定义伪操作 子程序的定义是由过程定义伪指令PROC和ENDP来完成的。其格式如下: 过程名 PROC [NEAR/FAR] ┆ 过程名 ENDP 其中PROC表示过程定义开始,ENDP表示过程定义结束。过程名是过程入口地址的符号表示 一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性(NEAR 和 FAR) 6.1 子程序的设计方法 6.1.1 过程定义伪操作 NEAR/FAR 属性 子程序定义时指定,CALL和RET时则由汇编程序来确定 过程属性的确定原则: NEAR:在同一代码段中 FAR:在不同代码段中 主程序MAIN应定义为FAR属性 例 6.1 子程序的设计方法 6.1.1 过程定义伪操作 SEGX SEGMENT ┆ SUBT PROC FAR ;虽然有一次调用是在本段内,但是 ;由于还有段外调用,所以要用FAR ┆ RET SUBT ENDP ;第一次调用 ┆ CALL SUBT ┆ SEGX ENDS ; SEGY SEGMENT ┆ CALL SUBT ;第二次调用 ┆ SEGY ENDS 6.1 子程序的设计方法 6.1.2 子程序的调用和返回 CALL和RET完成调用和返回的操作 注意运行时的堆栈状态 CALL调用时使返回地址入栈 RET时应该能使返回地址正确出栈 6.1 子程序的设计方法 6.1.3 保护现场和恢复现场 当主程序和子程序使用的寄存器发生冲突时要注意保存和恢复原有信息 可以利用堆栈来实现 PROG PROC PUSH AX PUSH BX PUSH CX ;保护现场 PUSH DX ┆ POP DX POP CX POP BX ;恢复现场 POP AX RET ;返回断点处 PROC ENDP 子程序所使用到的寄存器都要引起注意 6.1 子程序的设计方法 6.1.4 主程序和子程序的参数传递 通过寄存器传递参数 使用十分方便,是最常用的一种方式 只能用于参数不多的情况 6.1 子程序的设计方法 6.1.4 主程序和子程序的参数传递 如果过程和调用在同一源文件(同一程序模块中),则过程可以直接访问模块中的变量 例 6.4 主程序MAIN和过程PROADD在同一源文件中,要求用过程PROADD累加数组的所有元素,并把和(不考虑溢出的可能性)送到指定的存储单元中去 源程序 6.1 子程序的设计方法 6.1.4 主程序和子程序的参数传递 通过地址表传递参数 在主程序中建立一个地址表,将要传递给子程序的参数都存放在地址表中,然后将地址表的首地址通过寄存器BX传到子程序中去 子程序通过地址表取得所需参数,并将结果存入指定的存储单元中去 源程序 6.1 子程序的设计方法 6.1.4 主程序和子程序的参数传递 通过堆栈传送参数或参数地址 主程序将参数(参数地址)保存在堆栈中,子程序则从堆栈中取出参数(参数地址) 例:把内存中字变量num的值,转换为4个用ASCⅡ码表示的16进制数码,串的起始地址为string 源程序 6.1 子程序的设计方法 6.1.4 主程序和子程序的参数传递 例:求10个数的累加 源程序 6.1 子程序的设计方法 6.1.4 主程序和子程序的参数传递 多个模块之间的参数传递问题 PUBLIC伪指令 格式:PUBLIC 符号 [,符号] 功能:说明其后的符号是全局符号。全局符号能被其他模块引用。 EXTRN伪指令 格式:EXTRN 符号:类型 [,符号:类型] 功能:说明在本模块中需要引用的、由其他模块定义的符号,即外部符号。 6.1 子程序的设计方法 6.1.5 增强功能的过程定义伪操作 Procname PROC [attributes field] [USER register list] [,parameter field] … Procname ENDP Attributes field(属性字段)包括: Distance :
显示全部
相似文档