用汇编语言编写子程序后如何调用?
call crlf //这里调用crlf这个子程序
crlf proc near //这里写名为crlf的子程序
//子程序代码
ret
crlf endp
CODE SEGMENT
ASSUME CS:CODE
ORG 100H
START: PUSH CS
POP DS
PUSH CS
POP ES
MOV DI,0
MOV SI,0
MOV BX,10
@MAIN1: MOV CX,BX
CALL FACT
ADD SI,AX
ADC DI,DX
DEC BX
JNZ @MAIN1
MOV AX,SI
MOV DX,DI
CALL DISPDXAX
MOV AH,4CH
INT 21H
; cx中存放要求阶乘的数
; 阶乘结果在dx、ax中
FACT PROC NEAR
PUSH BX
PUSH SI
PUSH DI
PUSHF
MOV DX,0
MOV AX,1
@FACT1: MOV BX,CX
CALL MULT
LOOP @FACT1
POPF
POP DI
POP SI
POP BX
RET
FACT ENDP
; 将要显示的无符号数置于 ax 中
DISPAX PROC NEAR
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DS
PUSH CS
POP DS
MOV BYTE PTR NZ,0
PUSH AX
LEA SI,DIVARR
MOV CX,5
@1:
POP AX
MOV DX,0
MOV BX,[SI]
DIV BX
PUSH DX
CMP AL,0
JNE @2
CMP BYTE PTR NZ,1
JE @2
CMP CX,1
JE @2
MOV DL,20H
JMP @3
@2:
ADD AL,30H
MOV DL,AL
MOV BYTE PTR NZ,1
@3:
MOV AH,2
INT 21H
INC SI
INC SI
LOOP @1
POP DX
POP DS
POP SI
POP DX
POP CX
POP BX
RET
DIVARR DW 10000,1000,100,10,1
NZ DB 0
DISPAX ENDP
; 无符号乘法子程序 (mul指令只能实现16位乘16位,本子程序实现32位乘16位--限定数的大小,结果仍为32位)
; 被乘数放置于dx,ax 中, 乘数放置于 bx中
; 结果放置于dx,ax中(dx为高16位,ax为低16位)
MULT PROC NEAR
PUSH CX
PUSH SI
PUSH DI
PUSHF
MOV SI,0
MOV DI,0
CMP BX,0
JE @MULTEXIT
@MULT1: SHR BX,1
JNC @MULT2
ADD SI,AX
ADC DI,DX
@MULT2: SHL AX,1
RCL DX,1
CMP BX,0
JNE @MULT1
MOV DX,DI
MOV AX,SI
POPF
POP DI
POP SI
POP CX
RET
@MULTEXIT:
MOV AX,0
MOV DX,0
POPF
POP DI
POP SI
POP CX
RET
MULT ENDP
; 将要显示的32位无符号数置于dx、ax中
DISPDXAX PROC NEAR
MOV WORD PTR [Y],AX
MOV WORD PTR [Y+2],DX
; 以下将 Y (16进制)转为10进制串并输出
MOV AX,WORD PTR [Y] ;=====
MOV DX,WORD PTR [Y+2] ;=====
MOV BX,WORD PTR [Z] ;===== 这一段是关键,加上后不会出现除法溢出
MOV CX,WORD PTR [Z+2] ;=====
MOV WORD PTR N,0 ;=====
MM0: INC WORD PTR N ;=====
SUB AX,BX ; 不停地减 10万 ,得到被10万除的商,放在 n 中
SBB DX,CX ;=====
JNC MM0 ;=====
DEC WORD PTR N ; 保存 高5位
ADD AX,BX ;=====
ADC DX,CX ;=====
MOV WORD PTR[Y],AX ;=====
MOV WORD PTR[Y+2],DX ;=====
;==============
MM1: LEA DI,CC
ADD DI,9
M2:
MOV AX,WORD PTR [Y]
MOV DX,WORD PTR [Y+2]
MOV BX,10000
DIV BX ; 这里是发生溢出之处
PUSH AX
PUSH DX
; ============
; 以下转换10进制的低4位
POP DX
MOV CX,4
MOV AX,DX
M3: MOV DX,0
MOV BX,10
DIV BX
ADD DL,30H
MOV [DI],DL
DEC DI
LOOP M3
; ===========
; 以下转换10进制的高万位
POP AX
MOV CX,1
M4: MOV DX,0
MOV BX,10
DIV BX
ADD DL,30H
MOV [DI],DL
DEC DI
LOOP M4
;=============
MOV AX,WORD PTR N
MOV CX,5
M5: MOV DX,0
MOV BX,10
DIV BX
ADD DL,30H
MOV [DI],DL
DEC DI
LOOP M5
; ============
; 输出换行回车
LEA DX,LFCR
MOV AH,9
INT 21H
; ============
; 输出两数的和的10进制串
LEA DX,CC
MOV AH,9
INT 21H
RET
Y DD ?
CC DB 10 DUP(' '),10,13,'$'
LFCR DB 10,13,'$'
Z DD 100000
N DW 0
DISPDXAX ENDP
CODE ENDS
END START