第六章 子程序和宏指令设计.ppt
文本预览下载声明
第六章 子程序与宏指令设计 ; 为了程序共享或模块化设计的需要,可以把一段公共语句序列设计成子程序或宏指令的形式。;6.1 子程序结构及设计方法
6.2 子程序参数传递
6.3 嵌套与递归子程序
6.4 宏 指 令
6.5 宏指令库
6.6 重复伪指令
6.7 条件伪指令;6.1 子程序结构及设计方法;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;
6.1.2 设计子程序时应注意的问题
1.子程序说明
2.寄存器的保存与恢复
3.密切注意堆栈状态
;6.2 子程序参数传递;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 ;显示
INT 21H
RET
DEC_DIV ENDP
CODE ENDS
END MAIN;
6.2.2 同模块中的子程序可直接访问模块中的变量
若调用程序和子程序在同模块中,子程序可以直接访问模块中的变量。
例2.实现数组求和功能。要求数组求和(不考虑溢出情况)由子程序实现,其数组元素及结果均为字型数据。见程序6.4。; STACKSG SEGMENT STACK STK‘
DW 32 DUP(S)
STACKSG ENDS
DATA SEGMENT
ARY DW 1,2,3,4,5,6,7,8,9,10
COUNT DW ($-ARY)/2 ;数组元素个数
SUM DW ? ;数组和的地址
DATA ENDS;CODE1 SEGMENT
MAIN PROC FAR
ASSUME CS:CODE1,DS:DATA
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
CALL FAR PTR ARY_SUM
RET
MAIN ENDP
CODE1 ENDS;CODE2
显示全部