用汇编程序编写程序,输入一个不小于50的整数n,用递归计算n!,以十进制数输出。
时间: 2024-05-11 18:19:23 浏览: 122
以下是用x86汇编语言编写的递归计算n!程序,需要使用Masm或Tasm等汇编器进行编译:
```
.model small
.stack 100h
.data
n dw 0
result dw 0
.code
main proc
mov ax, @data
mov ds, ax
; 输入n
mov ah, 01h
int 21h
sub al, 30h ; 将ASCII码转换为数字
mov n, ax
; 计算n!
mov ax, 1
push ax ; 保存初始值1
push n ; 传递参数n
call factorial ; 调用递归函数
add sp, 4 ; 清除函数调用栈
; 将结果转换为字符串并输出
mov bx, result
call word_to_str
mov ah, 09h
lea dx, result_str
int 21h
mov ah, 4ch
int 21h
main endp
; 递归计算n!
factorial proc
push bp
mov bp, sp ; 建立函数调用栈
mov ax, [bp+4] ; 取出参数n
cmp ax, 1 ; 判断是否为1
je end_factorial ; 如果是1则返回
push ax ; 保存n
dec ax ; n-1
push ax ; 传递参数n-1
call factorial ; 递归调用
add sp, 4 ; 清除函数调用栈
pop ax ; 取出n-1的阶乘结果
mul word ptr [bp+6] ; 计算n*(n-1)!
push ax ; 保存n!
jmp end_factorial ; 返回
end_factorial:
mov ax, [bp+4] ; 取出参数n
cmp ax, 1 ; 判断是否为1
jle clear_stack ; 如果小于等于1则清除函数调用栈
pop ax ; 取出n!
ret ; 返回
clear_stack:
mov sp, bp ; 清除函数调用栈
pop bp
mov result, ax ; 将结果保存到全局变量result中
ret
factorial endp
; 将16位无符号整数转换为字符串
word_to_str proc
push ax
push bx
push cx
push dx
mov bx, 10 ; 十进制数
mov cx, 0 ; 字符串长度
mov dx, 0 ; 字符串末尾位置
loop_word_to_str:
xor dx, dx
div bx ; ax除以10,余数在dx中
add dl, 30h ; 将余数转换为ASCII码
push dx ; 将余数压入栈中
inc cx ; 字符串长度加1
test ax, ax ; 判断商是否为0
jnz loop_word_to_str ; 如果不为0则继续循环
mov bx, result_str ; 存储结果的字符串缓冲区
mov ah, 02h ; DOS功能号,输出字符
loop_pop:
pop dx ; 弹出一个余数
mov [bx], dl ; 将余数存入字符串缓冲区
inc bx ; 指向下一个字符位置
loop loop_pop ; 继续弹出余数直到栈为空
mov [bx], '$' ; 在字符串末尾添加结束符
pop dx
pop cx
pop bx
pop ax
ret
word_to_str endp
.data
result_str db 6 dup (?), '$' ; 存储结果的字符串缓冲区
end main
```
阅读全文