Вывод первых N членов последовательности Леонардо - Assembler

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

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

Написать программу, вычисляющую первых N членов последовательности Леонардо

Решение задачи: «Вывод первых N членов последовательности Леонардо»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small, Pascal
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         CrLf    db      0Dh, 0Ah, '$'
  9.         N       dw      20              ;количество выводимых чисел Леонардо
  10. .code
  11.  
  12. main    proc
  13.         mov     ax,     @data
  14.         mov     ds,     ax
  15.  
  16.         mov     cx,     N       ;количество выводимых чисел Леонардо
  17.         mov     bx,     0       ;номер выводимого числа Леонардо
  18. @@For:
  19.         ;вычисление очередного числа Леонардо
  20.         push    bx
  21.         call    L
  22.         ;вывод найденного числа на экран
  23.         call    Show_AX
  24.         ;вывод разделительного пробела
  25.         mov     ah,     02h
  26.         mov     dl,     ' '
  27.         int     21h
  28.         ;переход к следующему числу
  29.         inc     bx
  30.         loop    @@For
  31.  
  32.         mov     ax,     4C00h
  33.         int     21h
  34. main    endp
  35.  
  36. ;Вычисление числа Леонардо
  37. ;на входе:
  38. ; N  - номер возвращаемого числа Леонардо
  39. ;на выходе:
  40. ; ax - число Леонардо
  41. L       proc
  42.         arg     @@N:WORD
  43.         uses    bx
  44.  
  45.         ;если N<=1, то L(N)=1
  46.         mov     ax,     1
  47.         cmp     [@@N],    1
  48.         jbe     @@Return
  49.  
  50.         ;если N>1, то L(N)=L(N-2)+L(N-1)+1
  51.         mov     ax,     [@@N]
  52.         sub     ax,     1
  53.         push    ax
  54.         call    L
  55.         mov     bx,     ax      ;bx=L(N-1)
  56.         mov     ax,     [@@N]
  57.         sub     ax,     2
  58.         push    ax
  59.         call    L               ;ax=L(N-2)
  60.         add     ax,     bx      ;ax=L(N-2)+L(N-1)
  61.         add     ax,     1       ;ax=L(N-2)+L(N-1)+1
  62.  
  63. @@Return:
  64.         ret
  65. L       endp
  66.  
  67. ; выводит знаковое 16-разрядное число из регистра AX на экран
  68. ; входные данные:
  69. ; ax - число для отображения
  70. Show_AX proc
  71.         push    ax
  72.         push    bx
  73.         push    cx
  74.         push    dx
  75.         push    di
  76.  
  77.         mov     cx,     10
  78.         xor     di,     di      ; di - кол. цифр в числе
  79.  
  80.         ; если число в ax отрицательное, то
  81.         ;1) напечатать '-'
  82.         ;2) сделать ax положительным
  83.         or      ax,     ax
  84.         jns     @@Conv
  85.         push    ax
  86.         mov     dx,     '-'
  87.         mov     ah,     2       ; ah - функция вывода символа на экран
  88.         int     21h
  89.         pop     ax
  90.  
  91.         neg     ax
  92.  
  93. @@Conv:
  94.         xor     dx,     dx
  95.         div     cx              ; dl = num mod 10
  96.         add     dl,     '0'     ; перевод в символьный формат
  97.         inc     di
  98.         push    dx              ; складываем в стек
  99.         or      ax,     ax
  100.         jnz     @@Conv
  101.         ; выводим из стека на экран
  102. @@Show:
  103.         pop     dx              ; dl = очередной выводимый символ
  104.         mov     ah,     2       ; ah - функция вывода символа на экран
  105.         int     21h
  106.         dec     di              ; повторяем пока di<>0
  107.         jnz     @@Show
  108.  
  109.         pop     di
  110.         pop     dx
  111.         pop     cx
  112.         pop     bx
  113.         pop     ax
  114.         ret
  115. Show_AX endp
  116.  
  117. end     main

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

  1. Создаются локальные переменные для хранения данных.
  2. Объявляется размер модели и стека.
  3. Определяется переменная CrLf для хранения символа новой строки.
  4. Объявляется переменная N с значением 20 для определения количества выводимых чисел Леонардо.
  5. В процедуре main инициализируются регистры ax и ds, затем происходит цикл для вычисления и вывода чисел Леонардо.
  6. В процедуре L происходит вычисление числа Леонардо на основе переданного номера N.
  7. Процедура Show_AX отвечает за вывод числа на экран, включая обработку отрицательных чисел и их перевод в символьный формат. Весь код выполнен на ассемблере, хранит значения переменных в регистрах и стеке, а также реализует вычисление и вывод чисел Леонардо.

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


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

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

6   голосов , оценка 3.833 из 5

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

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

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