编写计算 N !的程序,数值 N 由键盘键入,结果在屏幕上显示。N 的范围为 0---65535。即刚好能被一个 16 位寄存器容纳。要求使用汇编语言
时间: 2024-02-05 08:11:28 浏览: 28
以下是使用x86汇编语言编写计算N!的程序,采用了递归的方式实现:
```
.model small
.stack 100h
.data
msg1 db "Enter a number (0-65535): $"
msg2 db 0dh, 0ah, "Factorial = $"
num dw ?
fact dw ?
.code
main proc
mov ax, @data
mov ds, ax
lea dx, msg1
mov ah, 09h
int 21h
mov ah, 01h
int 21h
sub al, '0'
mov num, ax
mov ah, 01h
int 21h
sub al, '0'
mov ah, 0
mov bl, al
shl ax, 1
add ax, bx
mov num, ax
mov ax, num
call factorial
lea dx, msg2
mov ah, 09h
int 21h
mov ax, fact
call print_num
mov ah, 4ch
int 21h
main endp
factorial proc
push bp
mov bp, sp
mov ax, [bp+4]
cmp ax, 1
je fact_one
mov bx, ax
dec ax
push ax
call factorial
pop ax
mul ax, bx
jmp end_fact
fact_one:
mov ax, 1
end_fact:
mov fact, ax
pop bp
ret
factorial endp
print_num proc
push ax
push bx
push cx
push dx
mov bx, 10
xor cx, cx
cmp ax, 0
jne print_loop
mov dl, '0'
mov ah, 02h
int 21h
jmp end_print
print_loop:
xor dx, dx
div bx
push dx
inc cx
cmp ax, 0
jne print_loop
print_digit:
pop dx
add dl, '0'
mov ah, 02h
int 21h
loop print_digit
end_print:
pop dx
pop cx
pop bx
pop ax
ret
print_num endp
end main
```
程序流程:
1. 输出提示信息,等待用户输入一个数。
2. 将用户输入的数转换为16位无符号整数,存储在num变量中。
3. 调用递归函数计算num的阶乘,结果存储在fact变量中。
4. 输出结果。
递归函数factorial采用了寄存器调用规则,将参数和返回值分别存储在bp+4和ax寄存器中。如果参数为1,则直接返回1;否则,先将参数减1,然后递归调用自身,最后将结果与原参数相乘得到阶乘。
输出函数print_num采用了栈调用规则,将参数和寄存器保存在栈中。首先使用除法操作将数字转换为字符串,然后逐个输出每一位数字。
注意,该程序仅适用于16位计算机,对于32位或64位计算机需要做相应的修改。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)