Рекурсия: найти n-ый член последовательности Фибоначчи - Assembler
Формулировка задачи:
Опишите рекурсивную функцию и с помощью этой функции посчитайте n-ый член последовательности Фибоначчи;
Решение задачи: «Рекурсия: найти n-ый член последовательности Фибоначчи»
textual
Листинг программы
LOCALS .model small .stack 1000h .data .code main proc mov ax, @data mov ds, ax mov ax, 10 push ax call Fibb call Show_AX mov ax, 4C00h int 21h main endp Fibb proc N: word push bp mov bp, sp mov ax, N cmp N, 2 ja @@Calc mov ax, 1 pop bp ret 2 @@Calc: push bx mov ax, N dec ax push ax call Fibb mov bx, ax mov ax, N sub ax, 2 push ax call Fibb add ax, bx pop bx pop bp ret 2 Fibb endp ; выводит число из регистра AX на экран ; входные данные: ; ax - число для отображения Show_AX proc push ax push bx push cx push dx push di mov cx, 10 xor di, di ; di - кол. цифр в числе @@Conv: xor dx, dx div cx ; dl = num mod 10 add dl, '0' ; перевод в символьный формат inc di push dx ; складываем в стэк or ax, ax jnz @@Conv ; выводим из стэка на экран @@Show: pop dx ; dl = очередной символ mov ah, 2 ; ah - функция вывода символа на экран int 21h dec di ; повторяем пока di<>0 jnz @@Show pop di pop dx pop cx pop bx pop ax ret Show_AX endp end main
Объяснение кода листинга программы
- Предполагается, что задача программы - вычисление n-го числа Фибоначчи.
- В начале программы переменной
axприсваивается значение 10, а затем она сохраняется в области данных. - Далее происходит вызов процедуры
Fibbс аргументомN. - Если
Nбольше 2, то происходит рекурсивный вызов процедурыFibbс аргументамиN-1иN-2. - Если
Nменьше или равно 2, то вaxзаписывается 1. - После вычисления n-го числа Фибоначчи происходит вызов процедуры
Show_AX, которая выводит это число на экран. - Процедура
Show_AXсначала вычисляет количество цифр в числе, затем преобразует число в строку и выводит каждую цифру на экран. - Процедура
Fibbиспользует стек для хранения промежуточных результатов. - В конце программы вызывается функция
int 21h, которая выводит на экран символ, а затем завершает выполнение программы.