DATAS SEGMENT
;此处输入数据段代码
;使用公式 aln10/ln2 <=b来估算出大概需要多少缓存空间
;定义一个1300个字长的缓冲区,因为不知道会输出到多长
DATA1 DB 1300 DUP(0)
DATA2 DB 1300 DUP(0)
;存放被乘数
BEICHENG DW 0h
;存放进位数
JINWEI1 DW 0h
N DW 1300
X DW 0
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
DB 1000 DUP(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
;先将起始数值设为1,进行乘法运算
mov bx,0
mov ax,1
mov ds:[0],ax
mov cx,1000
;从现在开始进入乘法运算,循环一千次
p1:
;做一次循环,乘以当前的cx
push cx
;保存当前的乘数
mov BEICHENG,cx
;对DATA1中的所有字节遍历一遍分别乘上dx
mov cx,650
mov bx,0
p11:
;先一次提取两个字节出来
mov al,ds:[bx]
inc bx
mov ah,ds:[bx]
sub bx,1
mov dx,BEICHENG
;现在ax存放低16位,dx存放高16位
mul dx
push dx
mov dx , JINWEI1
add ax,dx
pop dx
adc dx,0
mov ds:[bx],al
inc bx
mov ds:[bx],ah
inc bx
mov JINWEI1,dx
loop p11
pop cx
loop p1
;完成运算之后进行输出,先逆序
mov cx,N
mov bx,X
p2:
mov al,DATA1[BX]
mov ah,0
push ax
inc bx
loop p2
mov cx,N
mov bx,X
p3:
pop ax
mov DATA2[BX],al
inc bx
loop p3
MOV CX,N
MOV BX,X
BE: ;MOV N,CX
;MOV BX,X
push cx ;保存cx的数值
MOV DL,DATA2[BX]
INC BX
;MOV X,BX
push bx
CALL DELY
pop bx
pop CX ;读取cx的值
CMP CX,1
JE FINISH
LOOP BE
finish:MOV AH,4CH
INT 21H
DELY PROC NEAR
MOV BL,DL
MOV CL,4
SHR DL,CL
OR DL,30H
CMP DL,39H
JBE AD1
ADD DL,7
AD1: MOV AH,2
INT 21H
MOV DL,BL
AND DL,0FH
OR DL,30H
CMP DL,39H
JBE AD2
ADD DL,7
AD2: MOV AH,2
INT 21H
RET
DELY ENDP
CODES ENDS
END START
具体算求多少的阶乘时只需要修改其中的第一个cx的值
啊,不太好意思,计算缓存空间时给的空间太小了,应该改成1300的
1000的阶乘大概有2500+位数,所以给1300个字节才足够,600个太小了,是我疏忽了