| 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. |
| eax (ax/ah/al) | Аккумулятор |
| ebx (bx/bh/bl) | Базовый регистр |
| ecx (cx/ch/cl) | регистр-счетчик |
| edx (dx/dh/dl) | регистр данных |
| CS | Сегмент кода |
| DS | Сегмент данных |
| SS | Сегмент стека |
| ES | Дополнительный сегмент |
| FS (только с 286+) | Универсальный сегмент |
| GS (только с 386+) | Универсальный сегмент |
| esi (si) | Индекс источника |
| edi (di) | Индекс приемника |
| eip (ip) | Указатель команды |
| esp (sp) | Указатель стека |
| ebp (bp) | Указатель базы кадра стека |