用汇编写的计算阶乘N 的程序

首先给大家推荐一下我老师大神的人工智能教学网站。教学不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵黄段子!点这里可以跳转到网站

用汇编写的计算阶乘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 ;

点这里可以跳转到人工智能网站