Фибоначчи

Тема в разделе "WASM.BEGINNERS", создана пользователем Eretic, 28 июн 2009.

  1. Eretic

    Eretic New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2009
    Сообщения:
    41
    Привет всем кто зашёл в темку. Есть проблема. Задача по выводу в цикле первых 7 чисел последовательности Фибоначчи. Все числа нужно записать в eax. На форуме по Фибоначчи сложные примеры. Их мне пока сложно разобрать. Да и их очень мало. Мне нужен самый простейший.
    Сам пытался сделать и убил вечер. Помогите пожалуйста если не кодом то хотябы подробным объяснением как получить этот ряд.
     
  2. ivan2k2

    ivan2k2 New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2006
    Сообщения:
    95
    О_о

    первые 2 числа ряда
    1 1

    следующее равно сумме 2 предыдущих...
    то есть первые 7, это
    1 1 2 3 5 8 13

    впрочем иногда можно начинать не только с 1 и 1
     
  3. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Код (Text):
    1. init:
    2. lea edi,buffer
    3. mov ecx,n
    4. mov eax,101h
    5. mov [edi],ax
    6.  
    7. next:
    8. add al,[edi]
    9. mov [edi+2],al
    10. inc edi
    11. loop next
    наверное как-то так. Сам алгос особо не проверял, ибо я сонный, а на улице ппц жарко. Сам додумаешься.
     
  4. Eretic

    Eretic New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2009
    Сообщения:
    41
    Что такое ряд Фибоначчи я знаю. Я не могу выразить его вычисление на ассемблере.
    MSoft, неразобрал...
    Плиз кому не страшен сон и жара, приведите код с комментариями. Буду очень благодарен.
     
  5. sergMel

    sergMel New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2009
    Сообщения:
    1
    первые 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

    примерно так
     
  6. Eretic

    Eretic New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2009
    Сообщения:
    41
    Огромное спасибо sergMel!
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    Eretic
    Пример рекурсивной процедуры для вычисления чисел Фибоначчи
    Функция F(n), вычисляющая число Фибоначчи по правилу:
    если n=0 или n=1 тогда F(n)=1
    если n≥2 тогда F(n)=F(n-1)+F(n-2)
    В примере аргумент функции передается через регистр EAX, а значение возвращает-ся через регистр EBX
    Код (Text):
    1. .686P
    2. .model flat
    3. include windows.inc
    4. includelib user32.lib
    5. extern _imp__MessageBoxA@16:dword
    6. extern _imp__wsprintfA:dword
    7. .code
    8. start:
    9.     mov eax,N;вычисляем N-ое число Фибоначчи
    10.     call fibonacci      ;вызываем процедуру
    11.     push ebx ;переводим число в строку для вывода на экран
    12.     push offset format
    13.     push offset buffer
    14.     call _imp__wsprintfA
    15.     pop ecx;выравниваем стек после wsprintfA
    16.     pop ecx
    17.     pop ecx
    18.     push 0
    19.     push offset caption
    20.     push offset buffer
    21.     push 0
    22.     call _imp__MessageBoxA@16;выводим результат на экран
    23.     ret;выходим из программы
    24. fibonacci proc
    25. ;Аргумент функции передается через регистр EAX, а
    26. ;значение возвращается через регистр EBX:
    27. ; EBX=F(N) - число Фибоначчи с номером N (EAX=N)
    28.     cmp eax,1   ;если N>1 перейти к метке f
    29.     ja f1
    30. ;нерекурсивная ветвь
    31.     mov ebx,1   ;если N<=1 EBX=F(N)=1
    32.     retn
    33. ;рекурсивная ветвь
    34. f:  push eax  ;сохранить EAX
    35.     dec eax   ;EAX=N-1
    36.     call fibonacci
    37.     push ebx  ;сохранить EBX=F(N-1)
    38.     dec eax   ;EAX=N-2
    39.     call fibonacci;EBX=F(N-2)
    40.     pop eax     ;EAX=F(N-1)
    41.     add ebx,eax ;EBX=F(N)=F(N-2)+F(N-1)
    42.     pop eax         ;восстановить исходное значение в EAX
    43.     retn           
    44. fibonacci endp
    45. format  db 'fibonacci=%u',0
    46. buffer db 50 dup (0)
    47. caption db 'fibonacchi',0
    Как-то так, хотя будут ругать за рекурсию :)
     
  8. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Э?
    Код (Text):
    1. xor   ebx,ebx
    2. mov eax,1
    3. mov ecx,n
    4. @@:addxch eax,ebx
    5. loop @b
     
  9. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    то есть
    Код (Text):
    1. xor ebx,ebx
    2. mov eax,1
    3. mov ecx,n
    4. @@:xadd eax,ebx
    5. loop @b
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    Во вложении програмка, которая выведет столько чисел (в разумных пределах, конечно) сколько укажешь равным n, я указал n=70. Во вложении ехе и сорц, написано под WinXP. MSoft чудесный алгоритм! Чуть-чуть подправил :)
     
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    [add] Маленькое дополнение -- под числа отводится dword, поэтому число Фибоначчи не может быть больше 4294967295, это значит n не может быть больше 47
     
  13. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    [add] проблема, скорее в wsprintf :dntknw:
     
  14. Eretic

    Eretic New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2009
    Сообщения:
    41
    Mikl___
    Пример слишком сложный для новичка. Читаю книгу "Язык Ассемблер для процессоров Intel". И там задаётся такой пример. Ни работы со стеком, ни процедур не предполагается. Только цикл, переменные и основные команды.
     
  15. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    Красть -- так миллион, любить -- так королеву. А когда же вы усвоите MMX, SSE, SSE2? Так и не получите никакого удовольствия от ассемблера, а мой пример "вполне учебный"
     
  16. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    Мой вариант вычисления последовательности Фибоначчи:
    Код (Text):
    1. TITLE   Fibon@44i   (Fibon@44i.asm)
    2.  
    3. INCLUDE Irvine32.inc    ; В этой 'либе' простейшие процедуры
    4. ; (..CrLf, WriteDec,..) ввода-вывода.
    5.  
    6. .code
    7. main PROC
    8. mov eax,0
    9. mov ebx,0
    10. mov edx,0
    11. inc edx         ; EAX = 1
    12. mov ecx,50
    13. L1:
    14. add edx,eax
    15. mov eax,ebx
    16. mov ebx,edx
    17. call WriteDec       ; Отобразить беззнаковое целое из EAX
    18. call CrLf                  ; Новая строка
    19. Loop L1
    20. exit
    21. main ENDP
    22. END main
     
  17. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    а нильзя, ли, есчо - пример маленькой безумной программы для вычисления знаков числа пи?