汇编语言可以由多个子程序组成,但是必须包含一个main主程序
那么main主程序下如何调用其他子程序呢?
CALL指令与RET指令:
CALL指令:转移到调用的子程序 的指令
RET指令:子程序的返回指令
一般格式:CALL子程序名
RET
子程序类型:
NEAR:如果用户的子程序和主程序在同一个代码段,则使用near
FAR:如果用户的子程序和主程序不在一个代码段,则使用far
由MAIN主程序和ABC子程序组成的程序结构:
MAIN PROC
;MAIN 程序代码
CALL ABC
;MAIN 程序代码
MAIN ENDP
ABC PROC
;保存到堆栈。
;ABC程序代码。
;从堆栈还原。
RET
ABC ENDP
END MAIN
例:创建二进制输入INBIN子程序和二进制输出OUTBIN子程序,使用INBIN和OUTBIN子程序输入两个二进制数,执行XOR运算,然后以二进制数输出结果
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
MOV AH,2
MOV DL,'?'
INT 21H
CALL INBIN
MOV BH,BL
CALL INBIN
XOR BL,BH
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
CALL OUTBIN
MOV AH,4CH
INT 21H
MAIN ENDP
INBIN PROC
PUSH AX
PUSH DX
@BEGIN:
XOR BL,BL
MOV AH,1
INT 21H
@WHILE:
CMP AL,0DH
JE @END_WHILE
CMP AL,' '
JE @END_WHILE
CMP AL,'0'
JE @BINARY
CMP AL,'1'
JE @BINARY
JMP @ERROR
@BINARY:
AND AL,0FH
SHL BL,1
OR BL,AL
INT 21H
JMP @WHILE
@END_WHILE:
POP DX
POP AX
RET
@ERROR:
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
JMP @BEGIN
INBIN ENDP
OUTBIN PROC
PUSH AX
PUSH CX
PUSH DX
MOV CX,8
@OUTPUT:
ROL BL,1
JC @HIGH
MOV DL,30H
JMP @NEXT
@HIGH: MOV DL,31H
@NEXT:
INT 21H
LOOP @OUTPUT
POP DX
POP CX
POP AX
RET
OUTBIN ENDP
END MAIN