Ассемблер для Windows

Дизассемблированный текст программы (Рисунок ) Транслятор Borland C++



Рисунок 4.5.6. Дизассемблированный текст программы (Рисунок 4.5.5). Транслятор Borland C++ 5.0.

Кстати, функция ExitProcess(0) введена в текст программы для быстрого поиска нужного фрагмента в отладчике или дизассемблированном коде. Сразу видно, что оптимизацией здесь и не пахло. По такому тексту достаточно просто восстановить исходную Си-программу. А вот код, оптимизированный транслятором Visual C++ 6.0 (Рисунок 4.5.7).

.text 00401000 sub_401000 proc near ; CODE XREF: start+AF .text 00401000 push esi .text 00401001 mov esi, 0Ah .text 00401006 .text 00401006 loc_401006: ; CODE XREF: sub_401000+18 .text 00401006 push 61h .text 00401008 push 61h .text 0040100A push offset aCC ; "%c %c\n" .text 0040100F call sub_401030 ;printf .text 00401014 add esp, 0Ch .text 00401017 dec esi .text 00401018 jnz short loc_401006 .text 0040101A push 0 ; uExitCode .text 0040101C call ds:ExitProcess .text 00401022 pop esi .text 00401023 retn .text 00401023 sub_401000 endp





Рисунок 4.5.7. Дизассемблированный текст программы (Рисунок 4.5.5). Транслятор Visual C++ 6.0.

Я думаю, что текст на Рисунок 4.5.7 удивит Вас. Однако, что же здесь удивительного? Взгляните на текст Си-программы. Заданные нами два символьных массива - абсолютно ни к чему. Транслятор Visual C++ очень точно это подметил и изменил код так, что, как ни старайся, текст исходной программы восстановить не удасться. Конечно, такая оптимизация оказалась возможной только потому, что наши массивы используются в ограниченной области.

Рассмотрим далее некоторые способы оптимизации, которые могут пригодиться нам и при написании программ на ассемблере.



Содержание раздела