用MASM编写程序,输入一个不小于50的整数n,用递归计算n!,以十进制数输出。
时间: 2024-05-11 21:19:24 浏览: 143
下面是使用MASM汇编语言编写的递归计算n!程序:
```
.model small
.stack 100h
.data
n db 0
result db 0
.code
main proc
mov ax, @data
mov ds, ax
; 读入n
mov ah, 01h
int 21h
sub al, '0'
mov n, al
; 检查n是否大于等于50
cmp n, 50
jb input_error
; 计算n!
mov bl, n
call factorial
; 将结果转换为十进制数并输出
mov ax, 0
mov al, result
call print_decimal
mov ah, 4ch
int 21h
input_error:
mov ah, 09h
lea dx, input_error_msg
int 21h
jmp main
; 递归计算n!
factorial proc
cmp bl, 1
jbe done
dec bl
push bx
call factorial
mul bl
mov bl, result
pop bx
done:
mov result, al
ret
; 将一个8位数转换为十进制数并输出
print_decimal proc
push ax
push dx
mov dl, 10
div dl
cmp ah, 0
jz print_second_digit
print_first_digit:
add al, '0'
mov dl, al
mov ah, 02h
int 21h
jmp done_printing
print_second_digit:
mov dl, al
add dl, '0'
mov ah, 02h
int 21h
mov dl, '0'
mov ah, 02h
int 21h
done_printing:
pop dx
pop ax
ret
print_decimal endp
input_error_msg db 'Error: n must be greater than or equal to 50.', 0
end main
```
程序首先读入一个不小于50的整数n,并检查输入是否合法。然后调用递归函数`factorial`计算n!,最后将结果转换为十进制数并输出。
递归函数`factorial`的实现如下:
1. 首先检查是否需要递归结束,如果是,则直接返回。
2. 否则,将n减1并压入栈中,递归调用`factorial`计算(n-1)!,然后将结果乘以n并保存在`result`变量中,最后弹出栈并返回。
函数`print_decimal`将一个8位数转换为十进制数并输出。它首先将数除以10,然后依次输出商和余数。注意,输出两位数时需要先输出个位数,然后再输出十位数。
程序中使用了INT 21h中断来读取输入和输出结果。
阅读全文