Assemble 16-bit instruction set to achieve 1000 factorial and output

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

Guess you like

Origin blog.csdn.net/qq_20176001/article/details/92673993