Win32asm обучение

Ассемблер




        Win32Asm Tutorial

       

назад 1 - Ассемблер вперед

1.0 - Ассемблер

Ассемблер создан как замена двоичному коду, который понимает процессор. Давным-давно, когда еще не было никаких языков программирования высокого уровня, программы создавались на ассемблере. Коды ассемблера представляют непосредственно команды процессора, которые он может выполнять. Для примера:

add eax, edx

Эта инструкция, add, складывает вместе два значения. Eax и edx называются регистрами, они могут содержать значения, которые хранятся внутри процессора. Этот код будет преобразован в 66 03 C2 (шестнадцатиричный код). Процессор читает эти коды, и выполняет операцию, которую они представляют. Языки высокого уровня, например С, при компиляции преобразовывается в ассемблер, а ассемблер в двоичный код:

код C >>Компилятор>>

Ассемблер >>Ассемблер>>

выходной код (шестнадцатиричный)
a = a + b; add eax, edx 66 03 C2

(Учтите, что ассемблерный код упрощен, выходной код будет зависеть от контекста С кода)

1.1 - Почему?

Зачем нам использовать ассемблер, а не C и что-нибудь другое, если писать на ассемблере сложнее. Программы написаные на ассемблере быстрые и имеют очень маленькие размеры. В языках программирования высокого уровня компилятору сложнее производить выходной код. Компилятор должен выяснить метод оптимизации (по скорости или по размеру), для производства ассемблерного кода, и несмотря на то, что компиляторы постоянно улучшаются, они программируют код самостоятельно (с опцией оптимизации кода) стараясь производить как можно меньший и более быстрый код (но у них это не очень хорошо получается).

Примечание от переводчика:
Я провел эксперимент, написал программу (обычное окно с одной кнопкой в центре, которая закрывает его) на разных языках высокого уровня и после компиляции получил вот такие размеры этой самой программы:

C++ Builder 4 - 22 kb

Delphi 5 - 291 kb

Delphi 5 + библиотека KOL - 26 kb



Ассемблер MASM - около 3 kb

Так, что смотрите и делайте выводы, что лучше использовать.
Есть другое различие с некоторыми языками высокого уровня, это использование runtime DLL библиотек для их функций. Например, Visual C++ имеет библиотеку msvcrt.dll которая содержит стандартные С функции. В большинстве случаев, это работает хорошо, но иногда возникают проблемы с версиями dll. У пользователя всегда должны быть установленны эти DLL-библиотеки (что не всегда бывает). Для Visual C это не проблема, они устанавливаются вместе с windows.

Visual Basic даже не преобразовывает свой язык в ассемблер (хотя версия 5 и выше делают это частично, но не полностью), это сильно зависит от msvbvm50.dll, виртуальной машины Visual Basic. Exe файл, который создан VB состоит из простых частей кода и многих вызовов этой DLL. Вот почему VB очень медленный. Ассемблер это и есть самый быстрый язык. Он использует только системные DLL: kernel32.dll, user32.dll, и т.д.
Другое непонимание в том, что многие люди думают, что на ассемблере невозможно программировать. Безусловно, это сложно, но очень даже возможно. Создавать большие проекты на ассемблере, это довольно сложно, я использую его для создания маленьких программ, DLL библиотек и частей кода, где требуется скорость. Также, есть большое различие между DOS и Windows программами. DOS программы мспользуют прерывание как 'функции'. Подобно int 10 для видео, int 13 для доступа к файлам и т.д. В win, есть API, приложения программирующие интерфейс. Этот интерфейс состоит из функций, которые вы можете использовать в своих программах. В DOS программах, прерывания имеют номер прерывания и номер функции. В Win, API функции имеют только имена (например: MessageBox, CreateWindowEx). Вы можете импортировать библиотеки (DLL) и использовать функции внутри них. Это облегчает программирование на ассемблере. Подробнее об этом в следующих уроках.
[наверх]

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