📄 n!.asm
字号:
DATA SEGMENT
N DB 6
DB ?
DB 6 DUP(?)
COUNT = $ - N -2
N_BIN DW ?
MESSAGE DB 10,13,'N!='
RESULT_ASC DB 5 DUP(?) ;存放结果的ASCII码
FLAG DB '$'
INPUT DB 'INPUT N = ','$'
PWTAB DW 10000,1000,100,10,1
RESULT DW ? ;存放结果的二进制值
DATA ENDS
MAIN SEGMENT
ASSUME DS:DATA,CS:MAIN
BEGIN:
;寄存器赋初值
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET INPUT
MOV AH,09
INT 21H ;键盘中断输入N
MOV DX,OFFSET N
MOV AH,10
INT 21H
;调用ATOB函数,将A转换成二进制存入N_BIN
MOV AX,COUNT
PUSH AX ;参数1
MOV AX,2+OFFSET N
PUSH AX ;参数2
CALL ATOB ;调用ASCII码向二进制转换的子程序,N_BIN为A的二进制值
CALL FACT ;调用阶乘子程序
CALL BTOA
MOV DX,OFFSET MESSAGE ;输出结果
MOV AH,09
INT 21H
EXIT: MOV AH,4CH
INT 21H ;退出
MAIN ENDS
;子程序,将输入的ASCII码转换成二进制存入BIN
PROCE SEGMENT
ASSUME CS:PROCE,DS:DATA
ATOB PROC FAR
PUSH AX ;保存现场
PUSH BX
PUSH CX
PUSH BP
MOV BP,SP
PUSHF
MOV AX,DATA
MOV DS,AX
MOV SI,[BP+12] ;OFFSET BUF_A,OFFSET BUF_B
MOV CX,[BP+14]
XOR AX,AX
AGAIN: ADD AX,AX
MOV BX,AX
ADD AX,AX
ADD AX,AX
ADD AX,BX
MOV BH,0
MOV BL,[SI]
SUB BL,30H
ADD AX,BX
INC SI
CMP [SI],0DH ;回车结束
JLE RETURN
LOOP AGAIN
RETURN: MOV N_BIN,AX ;存数
POPF ;恢复现场
POP BP
POP CX
POP BX
POP AX
RET 4
ATOB ENDP
PROCE ENDS
;子程序,计算N的阶乘
PROCE SEGMENT
ASSUME CS:PROCE,DS:DATA
FACT PROC FAR
PUSH AX ;保存现场
PUSH BX
PUSH CX
PUSH BP
MOV BP,SP
PUSHF
MOV AX,DATA
MOV DS,AX
MOV CX,N_BIN
MOV AX,1
CMP CX,0 ;0!
JE RETURN1
MULT: MUL CX
DEC CX
CMP CX,0B
JG MULT
RETURN1:MOV RESULT,AX ;存数
POPF ;恢复现场
POP BP
POP CX
POP BX
POP AX
RET
FACT ENDP
PROCE ENDS
;子程序,将二进制转换成十进制的ASCII码
PROCE SEGMENT
ASSUME CS:PROCE,DS:DATA
BTOA PROC FAR
PUSH AX ;保存现场
PUSH BX
PUSH CX
PUSH BP
MOV BP,SP
PUSHF
MOV AX,DATA
MOV DS,AX
MOV DI,OFFSET RESULT_ASC
MOV SI,OFFSET PWTAB
MOV AX,RESULT
LOP1: XOR CL,CL
MOV BX,[SI]
LOP2: SUB AX,BX
JB NEXT
INC CL
JMP LOP2
NEXT: ADD AX,BX
ADD CL,30H
MOV [DI],CL
INC SI
INC SI
INC DI
CMP BX,1
JNZ LOP1
POPF ;恢复现场
POP BP
POP CX
POP BX
POP AX
RET 4
BTOA ENDP
PROCE ENDS
END BEGIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -