参数传递大概有3 种方式,它们是:通过寄存器传递、通过地址表传递以及通过堆栈传递。
用得最多的是第三种传递方式。
1. 通过寄存器传递参数。
优点:简单易用。
缺点:寄存器数量有限,所以传递参数个数有限
例子:
SUB_CODE SEGMENT
ASSUME CS:SUB_CODE
SUBPROG PROC FAR
PUSH AX
PUSH DX
MOV AH , 02H
MOV DL , BL
INT 21H
POP DX
POP AX
MOV AH , 4CH
INT 21H
SUBPROG ENDP
SUB_CODE ENDS
; MAIN PROGRAM
STACK_SEG SEGMENT
SPACE DB 100H DUP(?)
STACK_SEG ENDS
DATA_SEG SEGMENT
PARAM DB 2BH
DATA_SEG ENDS
MAIN_CODE SEGMENT
MAIN PROC FAR
ASSUME CS:MAIN_CODE , DS:DATA_SEG , SS:STACK_SEG
START:
MOV BX , DATA_SEG
MOV DS , BX
MOV BL , [PARAM]
CALL FAR PTR SUBPROG
MOV AH , 4CH
INT 21H
MAIN ENDP
MAIN_CODE ENDS
END START
2. 通过地址表传递参数
优点:参数个数不受限制
例子:
SUB_CODE SEGMENT
ASSUME CS:SUB_CODE
SUBPROG PROC FAR
PUSH AX
PUSH DX
MOV AH , 02H
MOV DL ,
INT 21H
MOV AH , 02H
MOV DL ,
INT 21H
POP DX
POP AX
MOV AH , 4CH
INT 21H
SUBPROG ENDP
SUB_CODE ENDS
; MAIN PROGRAM
STACK_SEG SEGMENT
SPACE DB 100H DUP(?)
STACK_SEG ENDS
DATA_SEG SEGMENT
PARAM DB 2BH,26H
DATA_SEG ENDS
MAIN_CODE SEGMENT
MAIN PROC FAR
ASSUME CS:MAIN_CODE , DS:DATA_SEG , SS:STACK_SEG
START:
MOV BX , DATA_SEG
MOV DS , BX
MOV BX , OFFSET PARAM
CALL FAR PTR SUBPROG
MOV AH , 4CH
INT 21H
MAIN ENDP
MAIN_CODE ENDS
END START
3. 通过堆栈传递参数
使用频率最高
例子:
SUB_CODE SEGMENT
ASSUME CS:SUB_CODE
SUBPROG PROC FAR
PUSH BP
MOV BP , SP
PUSH AX
PUSH DX
MOV AH , 02H
MOV DL ,
INT 21H
MOV AH , 02H
MOV DL ,
INT 21H
POP DX
POP AX
POP BP
MOV AH , 4CH
INT 21H
SUBPROG ENDP
SUB_CODE ENDS
; MAIN PROGRAM
STACK_SEG SEGMENT
SPACE DB 100H DUP(?)
STACK_SEG ENDS
DATA_SEG SEGMENT
PARAM DB 2BH,26H
DATA_SEG ENDS
MAIN_CODE SEGMENT
MAIN PROC FAR
ASSUME CS:MAIN_CODE , DS:DATA_SEG , SS:STACK_SEG
START:
MOV BX , DATA_SEG
MOV DS , BX
MOV BX , OFFSET PARAM
PUSH
PUSH
CALL FAR PTR SUBPROG
MOV AH , 4CH
INT 21H
MAIN ENDP
MAIN_CODE ENDS
END START
用得最多的是第三种传递方式。
1.
优点:简单易用。
缺点:寄存器数量有限,所以传递参数个数有限
例子:
SUB_CODE SEGMENT
ASSUME CS:SUB_CODE
SUBPROG PROC FAR
PUSH AX
PUSH DX
MOV AH , 02H
MOV DL , BL
INT 21H
POP DX
POP AX
MOV AH , 4CH
INT 21H
SUBPROG ENDP
SUB_CODE ENDS
; MAIN PROGRAM
STACK_SEG SEGMENT
SPACE DB 100H DUP(?)
STACK_SEG ENDS
DATA_SEG SEGMENT
PARAM DB 2BH
DATA_SEG ENDS
MAIN_CODE SEGMENT
MAIN PROC FAR
ASSUME CS:MAIN_CODE , DS:DATA_SEG , SS:STACK_SEG
START:
MOV BX , DATA_SEG
MOV DS , BX
MOV BL , [PARAM]
CALL FAR PTR SUBPROG
MOV AH , 4CH
INT 21H
MAIN ENDP
MAIN_CODE ENDS
END START
2.
优点:参数个数不受限制
例子:
SUB_CODE SEGMENT
ASSUME CS:SUB_CODE
SUBPROG PROC FAR
PUSH AX
PUSH DX
MOV AH , 02H
MOV DL ,
INT 21H
MOV AH , 02H
MOV DL ,
INT 21H
POP DX
POP AX
MOV AH , 4CH
INT 21H
SUBPROG ENDP
SUB_CODE ENDS
; MAIN PROGRAM
STACK_SEG SEGMENT
SPACE DB 100H DUP(?)
STACK_SEG ENDS
DATA_SEG SEGMENT
PARAM DB 2BH,26H
DATA_SEG ENDS
MAIN_CODE SEGMENT
MAIN PROC FAR
ASSUME CS:MAIN_CODE , DS:DATA_SEG , SS:STACK_SEG
START:
MOV BX , DATA_SEG
MOV DS , BX
MOV BX , OFFSET PARAM
CALL FAR PTR SUBPROG
MOV AH , 4CH
INT 21H
MAIN ENDP
MAIN_CODE ENDS
END START
3.
使用频率最高
例子:
SUB_CODE SEGMENT
ASSUME CS:SUB_CODE
SUBPROG PROC FAR
PUSH BP
MOV BP , SP
PUSH AX
PUSH DX
MOV AH , 02H
MOV DL ,
INT 21H
MOV AH , 02H
MOV DL ,
INT 21H
POP DX
POP AX
POP BP
MOV AH , 4CH
INT 21H
SUBPROG ENDP
SUB_CODE ENDS
; MAIN PROGRAM
STACK_SEG SEGMENT
SPACE DB 100H DUP(?)
STACK_SEG ENDS
DATA_SEG SEGMENT
PARAM DB 2BH,26H
DATA_SEG ENDS
MAIN_CODE SEGMENT
MAIN PROC FAR
ASSUME CS:MAIN_CODE , DS:DATA_SEG , SS:STACK_SEG
START:
MOV BX , DATA_SEG
MOV DS , BX
MOV BX , OFFSET PARAM
PUSH
PUSH
CALL FAR PTR SUBPROG
MOV AH , 4CH
INT 21H
MAIN ENDP
MAIN_CODE ENDS
END START
![](https://i-blog.csdnimg.cn/blog_migrate/2f60c0bc47d4178ac5e2b807936153ff.gif)