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