Привет всем кто зашёл в темку. Есть проблема. Задача по выводу в цикле первых 7 чисел последовательности Фибоначчи. Все числа нужно записать в eax. На форуме по Фибоначчи сложные примеры. Их мне пока сложно разобрать. Да и их очень мало. Мне нужен самый простейший. Сам пытался сделать и убил вечер. Помогите пожалуйста если не кодом то хотябы подробным объяснением как получить этот ряд.
О_о первые 2 числа ряда 1 1 следующее равно сумме 2 предыдущих... то есть первые 7, это 1 1 2 3 5 8 13 впрочем иногда можно начинать не только с 1 и 1
Код (Text): init: lea edi,buffer mov ecx,n mov eax,101h mov [edi],ax next: add al,[edi] mov [edi+2],al inc edi loop next наверное как-то так. Сам алгос особо не проверял, ибо я сонный, а на улице ппц жарко. Сам додумаешься.
Что такое ряд Фибоначчи я знаю. Я не могу выразить его вычисление на ассемблере. MSoft, неразобрал... Плиз кому не страшен сон и жара, приведите код с комментариями. Буду очень благодарен.
первые 2 числа в bx и ax например 1 1 mov bx,1 mov ax,1 mov dx,ax add ax,bx в ax следующее число можно сохранять mov bx,dx mov dx,ax и jmp на сложение все это в цикле сколько надо чисел в последовательности в куче примерно следующее mov cx,7 -число чисел mov ax,1 mov bx,1 mov dx,ax j10: add ax,bx тут надо сохранить ax mov bx,dx mov dx,ax loop j10 примерно так
Eretic Пример рекурсивной процедуры для вычисления чисел Фибоначчи Функция F(n), вычисляющая число Фибоначчи по правилу: если n=0 или n=1 тогда F(n)=1 если n≥2 тогда F(n)=F(n-1)+F(n-2) В примере аргумент функции передается через регистр EAX, а значение возвращает-ся через регистр EBX Код (Text): .686P .model flat include windows.inc includelib user32.lib extern _imp__MessageBoxA@16:dword extern _imp__wsprintfA:dword .code start: mov eax,N;вычисляем N-ое число Фибоначчи call fibonacci ;вызываем процедуру push ebx ;переводим число в строку для вывода на экран push offset format push offset buffer call _imp__wsprintfA pop ecx;выравниваем стек после wsprintfA pop ecx pop ecx push 0 push offset caption push offset buffer push 0 call _imp__MessageBoxA@16;выводим результат на экран ret;выходим из программы fibonacci proc ;Аргумент функции передается через регистр EAX, а ;значение возвращается через регистр EBX: ; EBX=F(N) - число Фибоначчи с номером N (EAX=N) cmp eax,1 ;если N>1 перейти к метке f ja f1 ;нерекурсивная ветвь mov ebx,1 ;если N<=1 EBX=F(N)=1 retn ;рекурсивная ветвь f: push eax ;сохранить EAX dec eax ;EAX=N-1 call fibonacci push ebx ;сохранить EBX=F(N-1) dec eax ;EAX=N-2 call fibonacci;EBX=F(N-2) pop eax ;EAX=F(N-1) add ebx,eax ;EBX=F(N)=F(N-2)+F(N-1) pop eax ;восстановить исходное значение в EAX retn fibonacci endp format db 'fibonacci=%u',0 buffer db 50 dup (0) caption db 'fibonacchi',0 Как-то так, хотя будут ругать за рекурсию
Во вложении програмка, которая выведет столько чисел (в разумных пределах, конечно) сколько укажешь равным n, я указал n=70. Во вложении ехе и сорц, написано под WinXP. MSoft чудесный алгоритм! Чуть-чуть подправил
[add] Маленькое дополнение -- под числа отводится dword, поэтому число Фибоначчи не может быть больше 4294967295, это значит n не может быть больше 47
Mikl___ Пример слишком сложный для новичка. Читаю книгу "Язык Ассемблер для процессоров Intel". И там задаётся такой пример. Ни работы со стеком, ни процедур не предполагается. Только цикл, переменные и основные команды.
Красть -- так миллион, любить -- так королеву. А когда же вы усвоите MMX, SSE, SSE2? Так и не получите никакого удовольствия от ассемблера, а мой пример "вполне учебный"
Мой вариант вычисления последовательности Фибоначчи: Код (Text): TITLE Fibon@44i (Fibon@44i.asm) INCLUDE Irvine32.inc ; В этой 'либе' простейшие процедуры ; (..CrLf, WriteDec,..) ввода-вывода. .code main PROC mov eax,0 mov ebx,0 mov edx,0 inc edx ; EAX = 1 mov ecx,50 L1: add edx,eax mov eax,ebx mov ebx,edx call WriteDec ; Отобразить беззнаковое целое из EAX call CrLf ; Новая строка Loop L1 exit main ENDP END main