| Win32Asm Tutorial |
![]() | назад | 11- Основы ассемблера в windows | вперед | ![]() |
11.0 - Основы ассемблера в windows
Теперь Вы имеете некоторые элементарные знания об ассемблере, здесь вы изучите, как писать ассемблере под windows.
11.1 - API
Основа программирования под windows лежит в Win API (Application Programming Interface). Это набор функций обеспеченных операционной системой. Каждая windows программа использует эти функции. Эти функции находятся в системных dll, таких как kernel, user, gdi, shell, advapi, и т.д. Есть два типа функций: ANSI и Unicode. Это имеет отношение к способу сохранения строки. С ansi, каждый байт представляет символ (ascii-код) и использует 0-байт, для указания конца строки (с нулевым символом в конце). Unicode использует формат widechar, который использует 2 байта на символ. Это позволяет использовать языки, которые нуждаются в большом количестве символов, подобно китайскому. Widechar строки оканчиваются двумя нулевыми байтами. Windows поддерживает оба типа, используя различные имена функций для ansi и unicode. Например:
MessageBoxA (суффикс 'A' означает для ansi)
MessageBoxW (суффикс 'W' означает для widechar (unicode))
Мы будем использовать только ansi.
11.1 - Импорт dll
Чтобы использовать функции из Win API, вы должны импортировать соответствующюю dll. In order to use the functions from the windows API, you need to import the dll's. Это делается библиотеками импорта (.lib). Эти библиотеки необходимы, потому что они позволяют системе (windows) загружать dll динамически. Пакет win32asm (win32asm.cjb.net) снабжен библиотеками для большинства стандартных dll. Вы можете подключить библиотеку директивой includelib.
includelib C:\masm32\lib\kernel32.lib
Этот код подключает библиотеку импорта kernel32.lib.
В примерах, используется вот такая форма:
includelib \masm32\lib\kernel32.lib
Теперь вы можете увидеть, почему ваши исходные файлы должны находится на том же диске, что и masm. Теперь Вы можете компилировать вашу программу на любом другом компьютере без изменения всех путей на правильный диск.
| .486 | Сообщает ассемблеру, чтобы он генерировал опкоды для 486 процессора. Вы также можете использовать .386, но .486 работает в большинстве случаев. |
| .model flat, stdcall | Используйте плоскую модель памяти (о которой рассказано в предыдущих уроках), и используйте вид вызовов stdcall. Это означает, что параметры для функции помещаются в стек справа налево (последний параметр, помещается в стек первым) и что функция сама должна исправить стек при выходе из нее. Это стандарт почти для всех windows API функций и dll. |
| option casemap:none | говорит ассемблеру сделать метки чувствительными к регистрам, то есть MessageBox и messagebox - это различные имена. Для правильной работы файла windows.inc, это значение должно быть 'none'. |
| includelib | рассмотрены выше |
| include | также рассмотрены выше |
| .data | начало секции инициализированных данных (см. предыдущие уроки) |
| .data? | начало секции не инициализированных данных (см. предыдущие уроки) |
| .const | начало секции констант (см. предыдущие уроки) |
| .code | начало секции кода (см. предыдущие уроки) |
|
start: end start |
Метка указывающая начало программы. Обратите внимание, что не требуется вызов метки 'start'. Вы можете использовать любое название для нее, т.к. используя директиву 'end' вы указываете, что это метка начала: startofprog: end startofprog |