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

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

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

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

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

textual
Листинг программы
LOCALS
 
.model small, Pascal
 
.stack 100h
 
.data
        CrLf    db      0Dh, 0Ah, '$'
        N       dw      20              ;количество выводимых чисел Леонардо
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        mov     cx,     N       ;количество выводимых чисел Леонардо
        mov     bx,     0       ;номер выводимого числа Леонардо
@@For:
        ;вычисление очередного числа Леонардо
        push    bx
        call    L
        ;вывод найденного числа на экран
        call    Show_AX
        ;вывод разделительного пробела
        mov     ah,     02h
        mov     dl,     ' '
        int     21h
        ;переход к следующему числу
        inc     bx
        loop    @@For
 
        mov     ax,     4C00h
        int     21h
main    endp
 
;Вычисление числа Леонардо
;на входе:
; N  - номер возвращаемого числа Леонардо
;на выходе:
; ax - число Леонардо
L       proc
        arg     @@N:WORD
        uses    bx
 
        ;если N<=1, то L(N)=1
        mov     ax,     1
        cmp     [@@N],    1
        jbe     @@Return
 
        ;если N>1, то L(N)=L(N-2)+L(N-1)+1
        mov     ax,     [@@N]
        sub     ax,     1
        push    ax
        call    L
        mov     bx,     ax      ;bx=L(N-1)
        mov     ax,     [@@N]
        sub     ax,     2
        push    ax
        call    L               ;ax=L(N-2)
        add     ax,     bx      ;ax=L(N-2)+L(N-1)
        add     ax,     1       ;ax=L(N-2)+L(N-1)+1
 
@@Return:
        ret
L       endp
 
; выводит знаковое 16-разрядное число из регистра AX на экран
; входные данные:
; ax - число для отображения
Show_AX proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    di
 
        mov     cx,     10
        xor     di,     di      ; di - кол. цифр в числе
 
        ; если число в ax отрицательное, то
        ;1) напечатать '-'
        ;2) сделать ax положительным
        or      ax,     ax
        jns     @@Conv
        push    ax
        mov     dx,     '-'
        mov     ah,     2       ; ah - функция вывода символа на экран
        int     21h
        pop     ax
 
        neg     ax
 
@@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

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

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

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

6   голосов , оценка 3.833 из 5
Похожие ответы