Маленькая безумная програмка

Тема в разделе "WASM.RESEARCH", создана пользователем Sha_Lun, 1 июн 2007.

  1. Sha_Lun

    Sha_Lun New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2007
    Сообщения:
    10
    У меня есть маленькая программка, 1536 байт, которая выводит числа фибоначчи. Я ее дизассемблировал идой и нихрена не могу понять код, более того, такое ощущение, что ее писал психически больной человек. Или может гений. Вот, посмотрите, ощутите :)
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    мб запакована?)

    глянул - вроде нет.. но пизал реально шизик=\
    даже импорт вручную делал
     
  3. Sha_Lun

    Sha_Lun New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2007
    Сообщения:
    10
    Не запакована. Я ее дебаггером прогонял.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    глянул - вроде нет.. но пизал реально шизик=\
    даже импорт вручную делал
     
  5. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Да лан, фасм да директивы data import / end data прямо в теле секции кода. Ничего особенно ручного и нет. (если не считать асма))
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    asmfan
    фасм не так собирает импорт вроде.
     
  7. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Пример идентичности с точностью до выравнивания строк, что я считаю багом прошлого фасма 1.64, а не ручным импортом, хотя кто знает.
     
  8. CroX

    CroX New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2006
    Сообщения:
    37
    Собрано похоже действительно fasm'ом, в пользу чего говорит название секции .flat
     
  9. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Посмотрел тут, очевидно используются макросы .while/.endw. Оптимизации вообще нету никакой. Я бы сказал, что это писал не больной, а или неопытный в асме, или любящий заморачивать другим мозги. Скорее всего код переписан с какого-нибудь друго языка.
     
  10. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    вот что у меня осталось
     
  11. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    dr_dred
    Код (Text):
    1. mov eax,N           ;вычисляем N-ое число Фибоначчи
    2.     call fibonacci          ;вызываем процедуру
    3.     push ebx
    4.     push offset format
    5.     push offset buffer
    6.     call _imp__wsprintfA
    7.     pop ecx             ;выравниваем стек после wsprintfA
    8.     pop ecx
    9.     pop ecx
    10.     push 0
    11.     push offset caption
    12.     push offset buffer
    13.     push 0
    14.     call _imp__MessageBoxA@16;выводим результат на экран
    15.     ret;выходим из программы
    16. fibonacci proc
    17. ;Аргумент функции передается через регистр EAX, а
    18. ;значение возвращается через регистр EBX:
    19. ; EBX=F(N) - число Фибоначчи с номером N (EAX=N)
    20.     cmp eax,1   ;если N>1 перейти к метке f
    21.     ja f
    22. ;нерекурсивная ветвь
    23.     mov ebx,1   ;если N<=1 EBX=F(N)=1
    24.     retn
    25. ;рекурсивная ветвь
    26. f:  push eax  ;сохранить EAX
    27.     dec eax   ;EAX=N-1
    28.     call fibonacci
    29.     push ebx  ;сохранить EBX=F(N-1)
    30.     dec eax   ;EAX=N-2
    31.     call fibonacci;EBX=F(N-2)
    32.     pop eax     ;EAX=F(N-1)
    33.     add ebx,eax ;EBX=F(N)=F(N-2)+F(N-1)
    34.     pop eax         ;восстановить исходное значение в EAX
    35.     retn           
    36. fibonacci endp
    37. format  db 'fibonacci=%u',0
    38. buffer db 50 dup (0)
    39. caption db 'fibonacchi',0
     
  12. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Mikl__
    ;)) хех, ну раз уж речь о маленьких числах, то вот:


    Код (Text):
    1. ; вход и выход - в eax
    2. Fibonacci:
    3.     xor ecx, ecx
    4.     xor edx, edx
    5.     or  ecx, eax
    6.     mov eax, edx
    7.     jz  .fin
    8.     inc edx
    9. @@: xadd    eax, edx
    10.     loop    @B
    11. .fin:   retn