汇编16位指令集 实现1000的阶乘并输出

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个太小了,是我疏忽了

猜你喜欢

转载自blog.csdn.net/qq_20176001/article/details/92673993
今日推荐