;求10的阶乘 10!=3628800
DATAS SEGMENT
message db 0dh,0ah,9,'10!= $'
c10 dw 10 ;输入时进制转换的数
n dw 10 ;要求阶乘的数
m dw ? ;步长
c dw ? ;进位
i dw ? ;
outputbuffer dw 300 dup(?) ;
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS ;
MOV DS,AX ;
;-------------------------------------------------------
main proc
mov dx,offset message
mov ah,9
int 21h
call fractor ;
mov cx,di
routput: ;循环输出
push cx ;
mov di,cx ;
call output
;
pop cx
dec cx
cmp cx,0
jge routput
displaylength:
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
exit:
;
mov ah,07h ;
int 21h ;
mov ax,4c00h ;
INT 21H ;
;
main endp ;
;--------------------------------------------------------
fractor proc near ;
mov cx,n ;
mov i,1 ;
mov m,0
;
push dx
mov di,0d ;
mov ax,di ;
mov bx,2d ;
mul bx ;
mov si,ax
pop dx
;
mov outputbuffer[si],1 ;
ctrli: ;
mov c,0
mov di,0 ;
ctrldi:
;
cmp di,m ;
jbe done ;
jmp cmpc ;
done:
push dx ;
mov ax,di ;
mov bx,2d ;
mul bx ;
mov si,ax
pop dx
;
mov ax,outputbuffer[si] ;
mov bx,i ;
mul bx ;
add ax,c ; ;
adc dx,0 ; ;
mov bx,10000 ;
div bx ;
mov c,ax
push dx ;
mov ax,di ;
mov bx,2d ;
mul bx ;
mov si,ax
pop dx ;
mov outputbuffer[si],dx ;
inc di ;
jmp ctrldi ;
cmpc: ;
cmp c,0 ;
ja three1 ;
jmp next ;
three1: ;
inc m ;
mov ax,c ;
mov outputbuffer[si+2],ax ;
;
next:
inc i
cmp cx,0
jng if0 ;
loop ctrli
if0:
mov di,m ;
ret ;
;
;
;
fractor endp ;
;-----------------------------------------------------
output proc near ;
C2:
push dx ;
mov ax,di ;
mov bx,2d ;
mul bx ;
mov si,ax
pop dx
;
mov bx,outputbuffer[si] ;
bid proc ;
mov cx,10000 ;
mov ax,bx ;
mov dx,0 ;
div cx ;
mov bx,dx
;
mov cx,1000 ;
call ddiv ;
mov cx,100 ;
call ddiv ;
mov cx,10 ;
call ddiv ;
mov cx,1
call ddiv ;
ret
;
bid endp ;
;---------------------------------
ddiv proc ;
mov ax,bx ;
mov dx,0 ;
div cx ;
mov bx,dx ;
mov dl,al ;
add dl,30h ;
mov ah,02h ;
int 21h ;
ret
;
ddiv endp ;
;
ret ;
output endp ;
;--------------------------------------------
CODES ENDS ;
END START ;
参考资料:ChenB_2009