Win32asm обучение

  d8ef8794     

Основы ассемблера в windows


     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. Теперь Вы можете компилировать вашу программу на любом другом компьютере без изменения всех путей на правильный диск.


Но подключение библиотека импорта это еще не все, что вы должны сделать. Файлы include (.inc) также необходимы. Они могут быть автоматически сгенерированы из библиотек, используя утилиту l2inc. Файлы include подключаются так:
include \masm32\include\kernel32.inc
Внутри include файлы, содержат определение прототипов функций dll, так что вы можете использовать invoke.
kernel32.inc:
...
MessageBoxA proto stdcall :DWORD, :DWORD, :DWORD, :DWORD
MessageBox textequ <MessageBoxA>
...
Вы можете заметить, что include-файл содержит ansi функции, а также определяет имена функций без суффикса 'A', чтобы они были такими-же, как их реальные имена: вы можете использовать MessageBox вместо MessageBoxA. После того, как вы подключили библиотеку и include-файл, вы можете использовать функцию:
invoke MessageBox, NULL, ADDR MsgText, ADDR MsgTitle, NULL
11.2 - include-файл 'windows'
Здесь есть еще специальный include-файл, названный windows.inc, который содержит все константы и структуры для windows API. Например, окно сообщений может иметь различные стили. Четвертый параметр функции это стиль. NULL (пустой указатель) замещает MB_OK, которая обозначает кнопку OK. Include-файл windows содержит определения для этих стилей:
MB_OK equ 0
MB_OKCANCEL equ ...
MB_YESNO equ ...
Так что вы можете использовать эти имена, как константы:
invoke MessageBox, NULL, ADDR MsgText, ADDR MsgTitle, MB_YESNO
Пример использует include-файл из пакета masm:
include \masm32\include\windows.inc
11.3 - "Каркас" программы
.486
.model flat, stdcall

option casemap:none

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\gdi32.lib
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\gdi32.inc
include \masm32\include\windows.inc
.data
    <Здесь ваши инициализируемые данные>
.data?
    <Здесь ваши не инициализируемые данные>
.const
    <Здесь ваши константы>


.code
start:
    <Здесь ваш код>
end start
Это основной "каркас" программы исходного файла ассемблера под windows (.asm).
.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

[наверх]

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