У меня есть маленькая программка, 1536 байт, которая выводит числа фибоначчи. Я ее дизассемблировал идой и нихрена не могу понять код, более того, такое ощущение, что ее писал психически больной человек. Или может гений. Вот, посмотрите, ощутите
Да лан, фасм да директивы data import / end data прямо в теле секции кода. Ничего особенно ручного и нет. (если не считать асма))
Пример идентичности с точностью до выравнивания строк, что я считаю багом прошлого фасма 1.64, а не ручным импортом, хотя кто знает.
Посмотрел тут, очевидно используются макросы .while/.endw. Оптимизации вообще нету никакой. Я бы сказал, что это писал не больной, а или неопытный в асме, или любящий заморачивать другим мозги. Скорее всего код переписан с какого-нибудь друго языка.
dr_dred Код (Text): 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 f ;нерекурсивная ветвь 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
Mikl__ ) хех, ну раз уж речь о маленьких числах, то вот: Код (Text): ; вход и выход - в eax Fibonacci: xor ecx, ecx xor edx, edx or ecx, eax mov eax, edx jz .fin inc edx @@: xadd eax, edx loop @B .fin: retn