汇编程序用子程序计算斐波那契数列,要求输入数字n可以计算n阶斐波那契数列的值
时间: 2023-08-04 15:36:50 浏览: 92
使用汇编语言计算斐波那契数
好的,下面是汇编程序,使用子程序计算斐波那契数列:
```
.data
n dw ? ; 输入的数值n
result dw ? ; 结果存储变量
.code
main proc
mov ax, @data
mov ds, ax ; 初始化数据段寄存器
; 读取输入的数值n
mov ah, 0ah ; 功能号0ah,读取字符串
mov dx, offset n ; 存储字符串的偏移地址
int 21h ; 调用中断
; 将输入的字符串转换为数值
mov si, offset n + 2 ; 跳过输入的长度和换行符
call ascii_to_num ; 调用子程序
; 计算斐波那契数列
mov ax, 0 ; F(0) = 0
mov bx, 1 ; F(1) = 1
mov cx, result ; 存储结果的变量
mov dx, n ; 循环计数器
call fibonacci ; 调用子程序
; 输出结果
mov ax, cx ; 将结果存储变量中的值读取到ax中
call write_dec ; 输出结果到屏幕
call crlf ; 输出换行符
mov ah, 4ch
int 21h ; 程序结束
main endp
; 子程序:将ASCII码字符串转换为数值
ascii_to_num proc
push ax
push bx
push cx
push dx
xor ax, ax ; ax = 0
mov cx, 10 ; cx = 10
L1:
mov bx, 10 ; bx = 10
mul bx ; ax = ax * 10
mov bl, [si] ; 取出当前字符
sub bl, '0' ; 转换为数值
add ax, bx ; ax = ax + bx
inc si ; 字符指针加1
loop L1 ; 循环至n次
mov result, ax ; 将转换后的数值存储到结果变量中
pop dx
pop cx
pop bx
pop ax
ret
ascii_to_num endp
; 子程序:计算斐波那契数列
fibonacci proc
push ax
push bx
push cx
push dx
L1:
cmp dx, 0 ; n == 0?
je L2 ; 跳转到L2
mov cx, ax ; cx = F(i-1)
add ax, bx ; ax = F(i-1) + F(i-2)
mov bx, cx ; bx = F(i-1)
dec dx ; n -= 1
jmp L1 ; 继续循环
L2:
mov cx, ax ; 将结果存储到结果变量中
pop dx
pop cx
pop bx
pop ax
ret
fibonacci endp
; 子程序:输出十进制数值
write_dec proc
push ax
push bx
push cx
push dx
xor bx, bx ; bx = 0
mov cx, 10 ; cx = 10
L1:
xor dx, dx ; dx = 0
div cx ; ax = ax / 10, dx = ax % 10
push dx ; 压入余数
inc bx ; bx += 1
or ax, ax ; ax == 0?
jnz L1 ; 不为0,继续循环
L2:
pop dx ; 取出余数
add dl, '0' ; 转换为ASCII码
mov ah, 02h ; 功能号2,输出字符
int 21h ; 调用中断
dec bx ; bx -= 1
jnz L2 ; bx 不为0,继续循环
pop dx
pop cx
pop bx
pop ax
ret
write_dec endp
; 子程序:输出换行符
crlf proc
mov dl, 0dh ; ASCII码0d,回车符
mov ah, 02h ; 功能号2,输出字符
int 21h ; 调用中断
mov dl, 0ah ; ASCII码0a,换行符
mov ah, 02h ; 功能号2,输出字符
int 21h ; 调用中断
ret
crlf endp
```
以上程序使用了四个子程序:`ascii_to_num`,`fibonacci`,`write_dec` 和 `crlf`。`ascii_to_num` 用于将输入的ASCII码字符串转换为数值,`fibonacci` 则用于计算斐波那契数列的值,`write_dec` 用于将一个十进制数值输出到屏幕上,`crlf` 则用于输出换行符。主程序中使用了两个变量:`n` 存储输入的数值,`result` 存储计算结果。首先读取输入的数值,并调用 `ascii_to_num` 子程序将输入的字符串转换为数值。然后调用 `fibonacci` 子程序计算斐波那契数列,并将结果存储到 `result` 变量中。最后调用 `write_dec` 和 `crlf` 子程序将结果输出到屏幕上。
阅读全文