用汇编写的计算阶乘N!的程序
输出:像253!=253*252×251....*2*1=结果(n=253)的形式
http://topic.csdn.net/u/20100706/09/1d9f99b8-6c1f-491f-bf25-d7f5c0b04f07.html?86340
;用汇编写的计算阶乘N!的程序,据网上程序修改
;网上源程序编译后为60KB,修改后代码编译的EXE大小为1K Bytes.
CODES SEGMENT
ASSUME CS:CODES,DS:CODES
main proc
START:
push cs
pop ds
;-----------------------------------------------
mov dx,offset string
mov ah,9
int 21h
call Shuru ;
cmp bp,10000
jbe cs_ok
mov dx,offset Error
mov ah,9
int 21h
jmp START
cs_ok: call show
mov n,bp
mov ax,0e0dh
int 10h
mov al,0ah
int 10h
call fractor ;
mov cx,di
routput: ;循环输出
push cx ;
mov di,cx ;
call output
pop cx
dec cx
cmp cx,0
jge routput
;
mov dx,offset YN
mov ah,9
int 21h
mov ah,0
int 16h ;
cmp ah,31h ;key: N(n)
jnz START
exit:
mov ax,4c00h ;
INT 21H ;
;
main endp ;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;1、键盘输入数据,以回车结束输入。(0~65535)
;2、数值结果放入BP
;3、可以直接调用,然后在BP里面娶出要的结果。
;!!! 超出65535的,如99999,取超出65536部分34463到BP!!!
Shuru proc
push dx
push cx
push bx
push ax
xor bp,bp
mov bx,10
mov cx,5
input:
mov ah,0 ;键盘输入数据
int 16h
cmp al,0dh ;以回车结束输入
jz ok
cmp al,'0' ;只允许输入0~9
jb input
cmp al,'9'
ja input
mov ah,0eh ;显示有效输入
int 10h
and ax,000fH
xchg ax,bp
mul bx ;扩大10倍
add bp,ax ;加一位
loop input
ok:nop ;数值结果放入BP
;恢复用到的寄存器
pop ax
pop bx
pop cx
pop dx
ret
Shuru endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
shuchu:
push dx
push cx
mov ax,cx
xor cx,cx
mov bx,10
nx1: xor dx,dx
div bx
or dx,0e30h
push dx
inc cx
cmp ax,0
jnz nx1
nx2: pop ax
int 10h
loop nx2
pop cx
pop dx
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
show:
mov ax,0e21h ;'!'
int 10h
mov al,"="
int 10h
mov cx,bp
jcxz sss
rss:
call shuchu
cmp cx,1
jz sss
mov ax,0e2ah ;"*"
int 10h
loop rss
sss:
mov ax,0e3dh ;"="
int 10h
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
fractor proc near ;
mov cx,n ;n,要求阶乘的数
mov i, 1
mov m, 0 ;m,步长
;
mov di,0
MOV SI,DI
SHL SI,1
;
mov word ptr [si+200h],1
ctrli: mov c, 0 ;c,进位
mov di,0
ctrldi: cmp di,m ;;m,步长
ja cmpc ;
done:
MOV SI,DI
SHL SI,1
;
mov ax,[si+200h] ;
mov bx,i ;
mul bx ;
add ax,c ; ;c,进位 ;
adc dx,0 ; ;
mov bx,10000 ;
div bx ;
mov c,ax ;c,进位
MOV SI,DI
SHL SI,1
mov [si+200h],dx ;
inc di ;
jmp ctrldi ;
cmpc: cmp c,0 ;c,进位
jbe next ;
inc m ;;m,步长
mov ax,c ;
mov [si+2+200h],ax ;
next: inc i
cmp cx,0
jng if0 ;
loop ctrli
if0: mov di,m ;;m,步长
ret ;
;
fractor endp ;
;------------------------------------------
output proc near ;
C2:
MOV SI,DI
SHL SI,1
mov bx,[si+200h] ;
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 ;
;----------------------------------------
string db 0dh,0ah,'Input a number(0-10000):',0dh,0ah,'$'
Error db 0dh,0ah,"Out of Range! $"
YN db 0dh,0ah,'Continue (Yes/No) ? $'
c10 dw 10 ;输入时进制转换的数
n dw ? ;要求阶乘的数
m dw ? ;步长
c dw ? ;进位
i dw ? ;
CODES ENDS ;
END START ;