编程求10!(汇编语言)

汇编语言阿

;求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

温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-04-13
data segment
N db 8;求N!
data ends

code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax

mov ah,0
mov al,N
push ax
call recursion
pop ax
call bini;将结果转换为十进制输出的子程序
mov ax,4c00h
int 21h
;栈传递要求递归的N值
;子程序的局限:N! <= 0xFFFFH

recursion:
push bp
push ax
mov bp,sp
;程序从call调用执行到此,进行了三次压栈,所以ss:[bp+6]是n
mov ax,ss:[bp+6]
cmp ax,0
;如果n的值不等于0,则计算(n - 1)!
jne recursion_next
;如果n的值等于0,则返回1(0!= 1)
mov ax,1
jmp recursion_end
recursion_next:
dec ax
push ax
;递归调用
call recursion
pop ax
;n的阶乘等于n乘以n-1的阶乘(n!= n*(n-1)!)
mul byte ptr ss:[bp+6]
recursion_end:
;计算结果用栈返回
mov ss:[bp+6],ax
mov bx,ss:[bp+6];最终运算结果存于bx寄存器中
pop ax
pop bp
ret

bini proc near
mov cx,10000d
call bin
mov cx,1000d
call bin
mov cx,100d
call bin
mov cx,10d
call bin
mov cx,1d
call bin
ret
bini endp

bin proc near
mov ax,bx
mov dx,0
div cx
mov bx,dx
mov dl,al
add dl,30h
mov ah,02h
int 21h
ret
bin endp
code ends
end start
第2个回答  2010-04-13
汇编语言(AssemblyLanguage)是面向机器的程序设计语言。在汇编语合中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。于是汇编语言亦称为符号语言。使用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理系统软件。汇编程序把汇编语言翻译成机器语言的过程称为汇编。
第3个回答  2010-04-14
_factoral:
push ebp
mov ebp, esp

mov eax, 1
mov ecx, [ebp+8] ; N(N! < 2^32 - 1)
@loop:
mul ecx
loop @loop

pop ebp
ret 4
第4个回答  2010-04-13
data.
sum dw 10
res dw 1
code.
mov ax,1
mov cx,10
lp:mul cx
loop lp
mov res,ax
相似回答