Вывод первых 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
Объяснение кода листинга программы
- Создаются локальные переменные для хранения данных.
- Объявляется размер модели и стека.
- Определяется переменная
CrLf
для хранения символа новой строки. - Объявляется переменная
N
с значением 20 для определения количества выводимых чисел Леонардо. - В процедуре
main
инициализируются регистрыax
иds
, затем происходит цикл для вычисления и вывода чисел Леонардо. - В процедуре
L
происходит вычисление числа Леонардо на основе переданного номераN
. - Процедура
Show_AX
отвечает за вывод числа на экран, включая обработку отрицательных чисел и их перевод в символьный формат. Весь код выполнен на ассемблере, хранит значения переменных в регистрах и стеке, а также реализует вычисление и вывод чисел Леонардо.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д