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
When calculating the factorial, you only need to modify the value of the first cx.
Ah, I’m not too embarrassed, the space given when calculating the cache space is too small, it should be changed to 1300
The factorial of 1000 has about 2500+ digits, so it is enough to give 1300 bytes, but 600 is too small, it is my negligence