第六章-子程序设计.ppt
文本预览下载声明
第六章 子程序设计 为了程序共享或模块化设计的需要,可以把一段公共语句序列设计成子程序或宏指令的形式。本章介绍子程序的设计方法。 在汇编语言中,允许子程序嵌套和递归。子程序作为调用程序去调用另一子程序,把这种关系称为子程序嵌套。嵌套的层数没什么限制,其层数称为嵌套深度。 在子程序嵌套情况下,如果一个子程序调用的子程序就是它自身,这样的子程序称为递归子程序。显然递归调用是子程序嵌套的一种特殊情况。用递归算法可设计出效率较高的程序。 子程序设计时,要注意堆栈足够大。 6.1 子程序结构及设计方法 一、子程序结构 在汇编语言中用过程定义伪指令定义子程序。过程定义伪指令格式: 过程名 PROC 类型 … 过程名 ENDP 过程名:子程序名,子程序入口的符号地址。类型: NEAR型(缺省值):子程序只可以被段内调用。 FAR型:子程序可以被段间或段内调用。 1.调用程序和子程序在同一个代码段的程序结构(子程序类型可缺省,注意END后必须跟主程序名) CODE SEGMENT MAIN PROC FAR … CALL SUB1 RET MAIN ENDP SUB1 PROC … RET SUB1 ENDP CODE ENDS END MAIN 2.调用程序和子程序在不同段的程序结构 (SUB2是FAR型,被段间及段内调用。CALL要显式说明是FAR类性) CODE1 SEGMENT MAIN PROC FAR CALL FAR PTR SUB2 RET MAIN ENDP CODE1 ENDS CODE2 SEGMENT SUB1 PROC FAR CALL FAR PTR SUB2 RET SUB1 ENDP SUB2 PROC FAR RET SUB2 ENDP CODE2 ENDS END MAIN 二、设计子程序时应注意的问题 1.子程序说明 为便于引用,子程序应在开头对其功能、调用参数和返回参数等予以说明,例如参数的类型、格式及存放位置等。 2.寄存器的保存与恢复 为保证调用程序的寄存器内容不被破坏,通常在子程序开头用PUSH保存,返回前用POP恢复。由于堆栈操作采用后进先出的规则,弹出寄存器的顺序应该与压入时的相反。 3.密切注意堆栈状态 设计含有子程序的程序时,要密切注意堆栈的变化。包括要注意一切与堆栈有关的操作,以确保堆栈平衡,否则后果不可预料。例如: CALL调用类型和子程序定义类型的一致性 PUSH和POP指令的匹配 通过堆栈传递参数时子程序返回使用RET n指令等 6.2 子程序参数传递 通过给子程序传递参数使其更通用。常用的参数传递方法如下: 通过寄存器传递; 通过内存传递:若主子程序在同模块中,子程序可以直接访问模块中的变量; 通过地址表传递参数地址; 通过堆栈传递参数或参数地址。 1.通过寄存器传递 这种传递方式使用方便,适用于参数较少的情况。 例1.把BX中的16位二进制数转换成十进制并显示在屏幕上。 分析:二进制到十进制数的转换方法有多种,本例采用从高到低逐个除以十进制位权的方法。 STASG SEGMENT DW 32 DUP(?) STASG ENDS CODE SEGMENT ASSUME CS:CODE MAIN PROC FAR MOV BX,162EH CALL TERN MOV AX,4C00H INT 21H MAIN ENDP TERN PROC ;二→十并显示,子程序嵌套例 MOV CX,10000 CALL DEC_DIV ;转换万位数 MOV CX,1000 CALL DEC_DIV ;转换千位数 MOV CX,100 CALL DEC_DIV ;转换百位数 MOV CX,10 CALL DEC_DIV ;转换十位数 MOV CX,1 CALL DEC_DIV ;转换个位数 RET TERN ENDP DEC_DIV PROC ;CX中为十进制的位权 MOV AX,BX MOV DX,0 DIV CX ;商为转换后的一位十进制数 MOV BX,DX MOV DL,AL ADD DL,30H ;转换成ASCII码 MOV AH,2 ;显示 IN
显示全部