Рекурсия: найти n-ый член последовательности Фибоначчи - Assembler

Узнай цену своей работы

Формулировка задачи:

Опишите рекурсивную функцию и с помощью этой функции посчитайте n-ый член последовательности Фибоначчи;

Решение задачи: «Рекурсия: найти n-ый член последовательности Фибоначчи»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 1000h
  6.  
  7. .data
  8.  
  9. .code
  10.  
  11. main    proc
  12.         mov     ax,     @data
  13.         mov     ds,     ax
  14.  
  15.         mov     ax, 10
  16.         push    ax
  17.         call    Fibb
  18.  
  19.         call    Show_AX
  20.  
  21.         mov     ax,     4C00h
  22.         int     21h
  23. main    endp
  24.  
  25. Fibb    proc    N: word
  26.         push    bp
  27.         mov     bp,     sp
  28.         mov     ax,     N
  29.         cmp     N,      2
  30.         ja      @@Calc
  31.         mov     ax,     1
  32.         pop     bp
  33.         ret     2
  34. @@Calc:
  35.         push    bx
  36.         mov     ax,     N
  37.         dec     ax
  38.         push    ax
  39.         call    Fibb
  40.         mov     bx,     ax
  41.         mov     ax,     N
  42.         sub     ax,     2
  43.         push    ax
  44.         call    Fibb
  45.         add     ax,     bx
  46.         pop     bx
  47.         pop     bp
  48.         ret     2
  49. Fibb    endp
  50.  
  51. ; выводит число из регистра AX на экран
  52. ; входные данные:
  53. ; ax - число для отображения
  54. Show_AX proc
  55.         push    ax
  56.         push    bx
  57.         push    cx
  58.         push    dx
  59.         push    di
  60.  
  61.         mov     cx, 10
  62.         xor     di, di          ; di - кол. цифр в числе
  63.  
  64. @@Conv:
  65.         xor     dx, dx
  66.         div     cx              ; dl = num mod 10
  67.         add     dl, '0'         ; перевод в символьный формат
  68.         inc     di
  69.         push    dx              ; складываем в стэк
  70.         or      ax, ax
  71.         jnz     @@Conv
  72.         ; выводим из стэка на экран
  73. @@Show:
  74.         pop     dx              ; dl = очередной символ
  75.         mov     ah, 2           ; ah - функция вывода символа на экран
  76.         int     21h
  77.         dec     di              ; повторяем пока di<>0
  78.         jnz     @@Show
  79.  
  80.         pop     di
  81.         pop     dx
  82.         pop     cx
  83.         pop     bx
  84.         pop     ax
  85.         ret
  86. Show_AX endp
  87.  
  88. end     main

Объяснение кода листинга программы

  1. Предполагается, что задача программы - вычисление n-го числа Фибоначчи.
  2. В начале программы переменной ax присваивается значение 10, а затем она сохраняется в области данных.
  3. Далее происходит вызов процедуры Fibb с аргументом N.
  4. Если N больше 2, то происходит рекурсивный вызов процедуры Fibb с аргументами N-1 и N-2.
  5. Если N меньше или равно 2, то в ax записывается 1.
  6. После вычисления n-го числа Фибоначчи происходит вызов процедуры Show_AX, которая выводит это число на экран.
  7. Процедура Show_AX сначала вычисляет количество цифр в числе, затем преобразует число в строку и выводит каждую цифру на экран.
  8. Процедура Fibb использует стек для хранения промежуточных результатов.
  9. В конце программы вызывается функция int 21h, которая выводит на экран символ, а затем завершает выполнение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы