Основы ассемблера
Win32Asm Tutorial |
назад | 3 - Основы ассемблера | вперед |
3.0 - Основы ассемблера
Эти туториалы обучат вас основам ассемблера.
3.1 - Коды операции (далее опкоды)
Программы Ассемблера созданы с помощью опкодов. Опкоды это команды, которые понимает процессор. Например:
ADD
Инструкция add складывает вместе два числа. Большинство опкодов имеют операнды:
ADD eax, edx
ADD имеет 2 операнда. В случае, источника и приемника. Она добавляет значение источника к значению приемника и сохраняет результат в приемнике. Операнды могут быть разных типов: регистры, ячейки памяти, непосредственные значения (см. ниже).
3.2 - Регистры
Есть несколько размеров регистров: 8 бит, 16 бит, 32 бит (и больше на MMX процессорах). В 16-разрядных программах, вы можете использовать только 8 и 16 битные регистры. В 32-разрядных программах вы также можете использовать 32 битные регистры.
Некоторые регистры являются частью других; например, если EAX содержит значение EA7823BBh, вот то, что содержат другие регистры.
EAX | EA | 78 | 23 | BB |
AX | EA | 78 | 23 | BB |
AH | EA | 78 | 23 | BB |
AL | EA | 78 | 23 | BB |
регистры ax, ah, al - части регистра eax. Eax это 32-битный регистр (доступный только начиная с 386+), ax содержит младшие 16 бит (2 байта) регистра eax, ah содержит старший байт регистра ax, и al содержит младший байт регистра ax. Регистр ax - 16 битный, al и ah - 8 битные. Так из примера выше, вот значения регистров:
eax = EA7823BB (32-бит)
ax = 23BB (16-бит)
ah = 23 (8-бит)
al = BB (8-бит)
Пример использования регистров (не заботьтесь об опкодах, просто смотрите на регистры и описание):
mov eax, 12345678h | mov загружает значение в регистр (Обратите внимание: 12345678h это шестнадцатиричное число, т.к. в конце стоит суффикс 'h') |
mov cl, ah | копирует старший байт регистра ax (67h) в регистр cl |
sub cl, 10 | вычесть 10 (десятичное) из значения в регистре cl |
mov al, cl | и сохранить его в младшем байте регистра eax. |
Давайте исследуем вышеприведенный код:
Mov команда может перемещать значение от регистра, памяти или непосредственного значения к другому регистру. В примере выше, eax содержит 12345678h. Затем значение регистра ах (3-ий байт слева в регистре eax) копируется в регистр cl (самый младший байт регистра ecx). Далее, из регистра cl вычитается 10, и затем значение из регистра cl копируется в регистр al(самый младший байт регистра eax).
Есть различные типы регистров:
Универсальные
Эти 32-битные (и 16/8 для их компонентов) регистры могут использоваться для чего угодно:
eax (ax/ah/al) | Аккумулятор |
ebx (bx/bh/bl) | Базовый регистр |
ecx (cx/ch/cl) | регистр-счетчик |
edx (dx/dh/dl) | регистр данных |
Хотя они и имеют названия, вы можете использовать их как угодно.
Сегментные регистры
Сегментные регистры определяют сегмент памяти, которая используется. Вероятнее всего, они вам не понадобятся в win32asm, потому, что windows использует плоскую систему памяти. В dos, память разделена на сегменты по 64kb, так, что если вы хотите определить адрес памяти, вы определяете сегмент и смещение (например 0172:0500 (сегмент:смещение)). В windows, сегменты имеют размер 4Gb, так, что в сегментации в win. Сегментные регистры всегда - 16-битные.
CS | Сегмент кода |
DS | Сегмент данных |
SS | Сегмент стека |
ES | Дополнительный сегмент |
FS (только с 286+) | Универсальный сегмент |
GS (только с 386+) | Универсальный сегмент |
Регистры указателя
Фактически, вы можете использовать регистры указателя, как универсальные регистры (eip - исключение), пока вы сохраняете их первоначальные значения. Регистры указателя называются так потому, что их часто используют для сохранения адресов памяти. Некоторые опкоды (movb,scasb, и т.д.) также их используют.
esi (si) | Индекс источника |
edi (di) | Индекс приемника |
eip (ip) | Указатель команды |
Регистр EIP (или IP в 16-разрядных программах) содержит указатель на команду, которую собирается выполнить процессор. Так что вы не можете использовать регистр eip как универсальный.
Регистры указателя стека
Есть 2 стековых регистра: esp & ebp. Esp содержит текущую позицию стека в памяти (подробнее об этом в следующих уроках). Ebp используется в функциях как указатель на локальные переменные.
esp (sp) | Указатель стека |
ebp (bp) | Указатель базы кадра стека |
[наверх]