(1)子程序的类型不同,对子程序的使用会带来什么不同
(2)子程序的定义该放在哪里?
(3)子程序和宏指令的区别?
子程序又称为过程,相当于高级语言的过程或函数,是一个独立的程序段,能完成某些确定的功能,并能被其它程序调用。
1)过程的定义
过程名 PROC 类型
。
。
。
RET
过程名 ENDP
类型:2种
near 段内,进程调用,偏移地址压入堆栈
far 段间,
2)过程的调用
CALL 过程名
a、段内调用
CSEG SEGMENT
CALL SUBT
MOV AH,4CH
INT 21H
SUBT PROC NEAR
RET
SUBT ENDP
CSEG ENDS
b、段间调用
XSEG SEGMENT
.
.
.
CALL SUBT1
.
.
.
MOV AH,4CH
INT 21H
SUBT1 PROC FAR
.
.
.
RET
SUBT1 ENDP
XSEG ENDS
YSEG SEGMENT
.
.
.
CALL SUBT1
.
.
.
YSEG ENDS
3)子程序在源程序中的位置
子程序一般是放在返回DOS语句和段结束语句之间的位置。因为在正常情况下这个区域的程序是不会被执行的。
4)宏指令与子程序
a、空间开销:子程序优于宏指令
b、时间开销:宏指令优于子程序
总上,当需多次访问的程序段较长,访问次数又不是太多时,选用子程序结构较好。当需多次访问的程序段较短,访问次数又很频繁时,选用宏指令结构更好。
5)子程序调用和宏调用使用例子:
A、子程序方法编程
DATA SEGMENT
HEXDATA DW 4D7EH
RESULT DB 4 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV CX,4
LEA SI,HEXDATA
LEA DI,RESULT
MOV BX,[SI]
NEXT: MOV AX,BX
AND AL,0FH
CALL HEXASC
MOV [DI],AL
INC DI
PUSH CX
MOV CX,4
SHR BX,CL
POP CX
LOOP NEXT
LEA SI,RESULT+3
MOV CX,4
STD
LOOP1: LODSB
MOV DL,AL
MOV AH,02H
MOV AH,02H
INT 21H
LOOP LOOP1
MOV DL,'H'
MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
HEXASC PROC
CMP AL,0AH
JB PLUS30
ADD AL,07H
PLUS30:ADD AL,30H
RET
HEXASC ENDP
CODE ENDS
END START
B、用宏指令方法编程
DATA SEGMENT
HEXDATA DW 4D7EH
RESULT DB 4 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
HEXASC MACRO
CMP AL,OAH
JB PLUS30
ADD AL,07H
PLUS30: ADD AL,30H
ENDM
MOV CX,4
LEA SI,HEXDATA
LEA DI,RESULT
MOV BX,[SI]
NEXT: MOV AX,BX
AND AL,0FH
HEXASC
MOV [DI],AL
INC DI
PUSH CX
MOV CX,4
SHR BX,CL
POP CX
LOOP NEXT
LEA SI,RESULT+3
MOV CX,4
STD
LOOP1: LODSB
MOV DL,AL
MOV AH,02H
INT 21H
LOOP LOOP1
MOV DL,'H'
MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START