Win32asm обучение

  d8ef8794     

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


        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) Указатель базы кадра стека

[наверх]

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