Вывод первых N членов последовательности Леонардо - Assembler
Формулировка задачи:
Написать программу, вычисляющую первых N членов последовательности Леонардо
Код к задаче: «Вывод первых N членов последовательности Леонардо - Assembler»
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
6 голосов, оценка 3.833 из 5
СОХРАНИТЬ ССЫЛКУ