CodeNet / Языки программирования / Ассемблер / Windows / Assembler & Win32. Курс молодого бойца
Команды ассемблера
6 октября 2006 года
Арифметические операции - ADD, SUB, MUL, DIV. Многие опкоды делают вычисления. Вы можете узнать многие из них по их названиям: add (addition - добавление), sub (substraction - вычитание), mul (multiply - умножение), div (divide - деление).
Опкод add имеет следующий синтаксис:
add приемник, источник
Выполняет вычисление: приемник = приемник + источник.
Имеются также другие формы:
приемник | источник | пример |
---|---|---|
регистр | регистр | add ecx, edx |
регистр | память | add ecx, dword ptr [104h] / add ecx, [edx] |
регистр | значение | add eax, 102 |
память | значение | add dword ptr [401231h], 80 |
память | регистр | add dword ptr [401231h], edx |
Эта команда очень проста. Она добавляет значение источника к значение приемника и помещает результат в приемник. Другие математические команды:
sub приемник, источник (приемник = приемник - источник) mul множимое, множитель (множимое = множимое * множитель) div делитель (eax = eax / делитель, edx = остаток)
Поскольку регистры могут содержать только целочисленные значения (то есть числа, не, с плавающей запятой), результат деления разбит на частное и остаток. Теперь, в зависимости от размера источника, частное сохраняется в eax, а остаток в edx:
размер источника | деление | частное в... | остаток в... |
---|---|---|---|
BYTE (8-bits) | ax / делитель | AL | AH |
WORD (16-bits) | dx:ax* / делитель | AX | DX |
DWORD (32-bits) | edx:eax* / делитель | EAX | EDX |
* = Например: если dx = 2030h, а ax = 0040h, dx: ax = 20300040h. Dx:ax - значение dword, где dx представляет старшее word, а ax - младшее. Edx:eax - значение quadword (64 бита), где старшее dword в edx и младшее в eax.
Источник операции деления может быть:
- 8-бит регистр (al, ah, cl,...)
- 16-бит регистр (ax, dx, ...)
- 32-бит регистр (eax, edx, ecx...)
- 8-бит значение из памяти (byte ptr [xxxx])
- 16-бит значение из памяти (word ptr [xxxx])
- a 32-бит значение памяти (dword ptr [xxxx])
Источник не может быть непосредственным значением, потому что тогда процессор не сможет определить размер исходного операнда.
Логические операции с битами - OR, XOR, AND, NOT.Эти команды работают с приемником и источником, исключение команда 'NOT'. Каждый бит в приемнике сравнивается с тем же самым битом в источнике, и в зависимости от команды, 0 или 1 помещается в бит приемника:
команда | AND | OR | XOR | NOT | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Бит источника | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
Бит приемника | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | X | X |
Бит результата | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 0 |
AND (логическое И)устанавливает бит результата в 1, если оба бита, бит источника и бит приемника установлены в 1.
OR (логическое ИЛИ)устанавливает бит результата в 1, если один из битов, бит источника или бит приемника установлен в 1.
XOR (НЕ ИЛИ)устанавливает бит результата в 1, если бит источника отличается от бита приемника.
NOTинвертирует бит источника.
Пример:
mov ax, 3406d mov dx, 13EAh xor ax, dx ax = 3406 (десятичное), в двоичном - 0000110101001110. dx = 13EA (шестнадцатиричное), в двоичном - 0001001111101010.
Выполнение операции XOR на этими битами:
Источник = 0001001111101010 (dx) Приемник = 0000110101001110 (ax) Результат = 0001111010100101 (новое значение в ax)
Новое значение в ax, после выполнения команды - 0001111010100101 (7845 - в десятичном, 1EA5 - в шестнадцатиричном).
Другой пример:
mov ecx, FFFF0000h not ecx FFFF0000 в двоичном это - 11111111111111110000000000000000
Если вы выполните инверсию каждого бита, то получите:
00000000000000001111111111111111 , в шестнадцатиричном это 0000FFFF
Значит после операции NOT, ecx будет содержать 0000FFFFh.
Увеличение/Уменьшение - INC/DEC.Есть 2 очень простые команды, DEC и INC. Эти команды увеличивают или уменьшают содержимое памяти или регистра на единицу. Просто поместите:
inc регистр ; регистр = регистр + 1 dec регистр ; регистр = регистр - 1 inc dword ptr [103405] ; значение в [103405] будет увеличено на 1. dec dword ptr [103405] ; значение в [103405] будет уменьшено на 1.
Ещё одна команда сравнения - test.Команда Test выполняет операцию AND (логическое И) с двумя операндами и в зависимости от результата устанавливает или сбрасывает соответствующие флаги. Результат не сохраняется. Test используется для проверки бит, например в регистре:
test eax, 100b jnz смещение
Команда jnz выполнит переход, если в регистре eax третий бит справа - установлен. Очень часто комманду test используют для проверки, равен ли регистр нулю:
test ecx, ecx jz смещение
Команда jz выполнит переход, если ecx = 0.
Ничего не делающая команда - nop. Эта команда не делает абсолютно ничего (пустая команда). Она только занимает пространство и время. Используется для резервирования места в сегменте кода или организации программной задержки.
Обмен значениями - XCHG. Команда XCHG также весьма проста. Назначение: обмен двух значений между регистрами или между регистрами и памятью:
mov eax , 237h mov ecx, 978h xchg eax, ecx
в результате:
eax = 978h ecx = 237h
Вот и конец урока. Надеюсь, этот не был скучным. Следующий урок расскажет вам про подпрограммы.
Назад | Оглавление | Далее
Оставить комментарий
Комментарии
AX = 02d
CX = 05d
BX = 03d
====<ASSEMBLER>====
mul cx ; AX *= CX AX = AX * CX
mul bx ; AX *= BX AX = AX * BX
====<ASSEMBLER>====
mul ax, cx ; AX *= CX AX = AX * CX
push ax
pop ax
mul ax, bx ; AX *= BX AX = AX * BX
====<ASSEMBLER>====
=>
XOR - cross OR, т.е. кросс ИЛИ
Источник = 0001001111101010 (dx)
Приемник = 0000110101001110 (ax)
Результат= 0001111010100100 (новое значение в ax)