Твой софтовый форум > Тематические форумы > Программирование

Ассемблер под win32

,

Вторая статья от ZaHack'a

Дата публикации: 08.04.2006 - 19:03
ZaHack
Еще одна статейка от ZaHack'a
Вот решил написать еще одну статейку об асме.Хочу показать народу прелести этого языка. wink.gif
Программирование на ассемблере под windows?
Многие люди думают, что на асме кодили только под ДОС. Это не так. Конечно, актуальность асм-кодинга под винду снижается, т.к. появляются среды разработки, такие как Visual C++ и Delphi, которые берут на себя всю "рутинную" работу, такую как: изготовление шаблонных форм, автоматическую генерацию ресурс-скриптов, взаимодействие элементов интерфейса и т.д. Но программист убаюканый возможностями этих средств разработки забывает о таком понятии как оптимизация кода и его минимизация; он начинает думать, что современные процессоры могут обрабатывать миллионы операций в секунду, а значит пара-тройка "лишних" процессов, созданных программой ничего не изменит;он начинает думать, что превыше всего скорость создания проекта, а не безопасный код и его оптимизированность. В итоге этот человек из творца-кодера (а кодинг - это, имхо, настоящее искусство) он превращается в ремесленника-шаблонщика sad.gif В этой статье я хочу показать, что ассемблер это не заумная теоретическая бурда, а реальный хардкор, с помощью которого можно творить реальные вещи, эффективнее и иногда быстрее, чем в многомегабайтных средах разработки.
Я рассмотрю компиляцию проектов в МАSM32, FASM, Delphi,. (FASM - замечательная тулза с хорошим макроязыком.Беги за ним на wasm.ru)
Ох уж этот "Hello world!" или минимизируем по самые гланды.
С чего всегда начинают учить программированию? Правильно с "Hello world!".И где-же легче всего, а главное быстрее сделать Win32 "Hello world!" ? "Конечно же в Дельфи!" - воскликнет юзер Акакий Недристович Перевыпивайко ( Акакий Недристович,если Вы действительно существуете, то приношу искренние извинения) и будет неправ. Потому что, чтоб сделать чистый мессагебокс в Дельфи без формы, то её придется убирать из списка автосоздаваемых, править код и т.д. Да бросьте вы! Вот пять строчек:
include 'win32ax.inc'
.code
start:
invoke MessageBox,HWND_DESKTOP,"Hello world!","Пример №1 wink.gif",MB_OK
invoke ExitProcess,0
.end start

Это было в FASM. В МАСМе на две строчки длиннее (объявление переменных). Наша прога занимает один (!) килобайт. Для сравнения: "пустая" программа в Дельфи, которая возникает при загрузке среды (и если сразу нажать Ctrl+f9) занимает целых 359 Кб! А "пустая" консольная программа в Дельфи занимает 38,5 Кб (для сравнения консольный "Hello world!" занимает 22 байта wink.gif ). Что-то не так, верно? Все очень просто.Среда разработки наворачивает очень много мусорных инструкций и функций даже для пустой программы, для удобства программиста. Ну что ж, за комфорт надо платить. И программист платит размером и скоростью выполнения программ.А ассемблер?(Возглас Акакия Недристовича) А ассемблер- это язык процессора, он ничего не создает, а значит в асм-программе НЕ БУДЕТ лишнего кода, при условии, что вы сами не создадите 200 Кб мусорных инструкций smile.gif
"Да"- воскликнет Акакий Недристович, роняя пенсне, - "Но это был всего лишь мессагебокс. А вот если кодить программу, которая, например обращается к железу (не напрямую разумеется), то, вероятно, Дельфи выигрывает!" Он опять неправ. Возьмем такой код:
include 'win32a.inc'
invoke MessageBox,0,_message,_caption,MB_ICONQUESTION+MB_YESNO
cmp eax,IDYES
jne exit

invoke mciSendString,_cmd_open,0,0,0
invoke mciSendString,_cmd_eject,0,0,0
invoke mciSendString,_cmd_close,0,0,0

exit:
invoke ExitProcess,0

_message db 'Открыть дисковод?',0
_caption db 'Пример №2',0

_cmd_open db 'open cdaudio',0
_cmd_eject db 'set cdaudio door open',0
_cmd_close db 'close cdaudio',0

data import

library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL',\
winmm,'WINMM.DLL'

import kernel32,\
ExitProcess,'ExitProcess'

import user32,\
MessageBox,'MessageBoxA'

import winmm,\
mciSendString,'mciSendStringA'

end data


Этот код даже с первого взгляда прост как три рубля. Инициализируется мессагебокс с "да-нет" кнопками, если "да" то идем дальше, если "нет" прыгаем на процедуру выхода (Примеч.-В асме не будем различать понятия "процедура" и "функция", т.к. эти понятия применяются в разных значениях только в языках высокого уровня). Потом идут объявления переменных и API-функций, использованных в программе - рутина.
В дельфи такая прога содержит столько же, если не больше рукописного кода, но весит 370 Кб. А сколько же весит асмовская "открывалка дисковода"?? Смотрим, и душа радуется: 1 Кб!
Вот мы рассмотрели пример реальной визуальной win32 программы, написанной на ассемблере.Она не бесполезна - можно прикалываться над ламерами, кидать эту прогу на автозапуск.Чайник вставляет диск в дисковод, а тот обратно выезжает biggrin.gif Что же мы выяснили? А то что слухи об смерти ассемблера весьма и весьма преувеличены. Как сказал один умный человек, Владислав Пирогов:"Ассемблер - это язык процессора и, следователно, он будет нужен до тех пор, пока будут существовать процессоры." Свой опус мне хотелось бы закончить еще одной красивой фразой уже от Криса Касперски:"Ассемблер - мощное оружие, дающее безграничную власть над системой. Это седьмое чувство и второе зрение...Добыча недокументированных функций и возможностей из недр операционной системы, создание и обезвреживание вирусов, адаптация приложений под собственные нужды, рассекречивание алгоритмов и заимствование чужих идей, взлом приложений… Список можно продолжать до бесконечности."
Ну вот в общем и все.Надеюсь мой опус хоть кого-нибудь заинтересовал и пробудил интерес к асму.
ЗЫ Просьба не придираться к стилю - пишу как умею smile.gif
Love.sys
Хм.. разница действительно на лицо. Грузные бинарники того же Дельфи и рядом не валяются с однокилобайтными (а фактически меньшеми чем 1 кб) бинаркодами всеме любимого асма. Маленький экскурс, почему же всё таки меньше 1 кб. Да очень просто, 1 кб это стандартный минимум более распространнёных файловых систем. Всем известно, что 1 симл будет равен 1 байту. В твоём примере исходник проги (даже не скомпилированный пока ещё) ну не как уж не привышает 1024 символа по содержательности. хм.. что то меня понесло не туда. Так вот, на чём это я... а... вот ты говорил о бытующим мнении некоторых "хороших" программеров о якобы вымирании языка. !! Ассемблер никогда не умрёт он будет жить и радовать нас своим неограниченным списком возможностей.
Хочется так же вспомнить давнишнюю игрушку kkreider и конкурсы assemler-pati. Когда полноценная Трёхмерная игра, со спец эффектами, бипмапиингом, анизотрапией и шейдерами (20 уровней вроде было в ней) занимала все-навсего дискового пространства 64 КБ!!! Вы только вдумайтесь в эти цифры! Чистый асм и команды Direxa-a.
А демки? теже 32к шедевры!
Я думаю асм-программеры ещё будут показывать нам чудеса кодинга, всё ещё в переди.
ZaHack
Кстати, кому надо могу выложить и исходник на Дельфи


Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке: Ассемблер под win32
SoftoRooM © 2004-2024