汇编用子程序设计计算N! N值无限制

来源:百度知道 编辑:UC知道 时间:2024/06/16 07:30:34
编制计算N!的程序,数值N由键盘输入,结果在屏幕上输出,N的范围是0到0xFF。即刚好能够被一个16位寄存器容纳。
编制阶乘程序的难点在于随着N的增大,其结果远不是寄存器所能容纳的,这样就必须将结果放在一个内存缓冲区中,然而乘法运算只能限制两个字相乘,因此要确定好算法,依次从缓冲区中取数,进行两字相乘,并将DX中的高16位积作为产生的进位。
程序根据阶乘的定义:N!=N•(N-1)•(N-2)•……•2•1,从左往右依次计算,结果保存在缓冲区BUF中,缓冲区BUF按结果由低到高依次排列。程序首先将BP初始化为存放N值,然后使BP为N-1,以后BP依次减1,直至变化为1,每次让BP与BUF中的字单元按由低到高的次序相乘,低位结果AX仍保存在相应的BUF字单元中,最高位结果DX则送到进位字单元CY中,以作为高字单元相乘时从低字来的进位,初始化CY为0,计算结果的长度随着乘积运算而不断增长,由字单元LEN指示,当最高字单元与BP相乘时,若DX不为0,则结果长度要扩展。

;输入0-40,求立方,并显示
;
code segment
assume cs:code,ds:code
org 100h
start:
push cs
pop ds
Again:lea dx,Tips1
mov ah,9
int 21h ;显示提示
xor bp,bp ;BP清0
mov cx,2
@In:mov ah,0
int 16h ;无回显输入
cmp al,1bh ;Esc退出程序
jz quit
cmp al,0dh
jz Show ;回车结束输入
cmp al,'0'
jb @In
cmp al,'9';数据校验
ja @In
mov ah,0eh
int 10h ;显示有效输入
and al,0fh
mov ah,0
xchg ax,bp
mov bl,10 ;BP×10
mul bl
add bp,ax ;BP+AX
loop @In
Show:
cmp bp,40
jbe Q4
lea dx,CuoWu
mov ah,9
int 21h
jmp quit
Q4:
xor dx,dx
mov ax,bp
mul bp
mul bp
mov dx,ax
mov CUBE,ax
push ax
mov al,'='
mov ah,0eh
int 10h
pop ax
call binidec
jmp start
quit:
mov ah,0
int 16h
mov ah,4ch<