Команды ассемблера
dest — операнд-приемник; первый операнд команды и местонахождение результата;
src — операнд-источник; второй операнд команды;
src16 — шестнадцатиразрядный операнд-источник;
src8 — восьмиразрядный операнд-источник;
count — счетчик; может задаваться либо непосредственным операндом, либо с
помощью регистра CX(CL);
reg16 — шестнадцатиразрядный регистр;
mem16 — шестнадцатиразрядное слово памяти;
acc — аккумулятор — регистр AX(AL);
port — адрес порта ввода/вывода, задаваемый непосредственно;
addr — адрес памяти;
far_addr — "дальний адрес" — адрес в формате "сегмент:смещение";
near_addr— "близкий адрес" — адрес в формате "смещение";
short_label — "короткая метка" — метка(адрес) отстоящая от текущего адреса не
более чем на +/- 127 байт, фактически всегда преобразуется в однобайтовое знаковое
смещение;
7.6.1. Арифметические и логические инструкции
ADD dest, src Сложить два операнда: dest+src->dest
ADC dest, src Сложить два операнда с учетом переноса
src+dest+cy->dest
INC dest Увеличить содержимое операнда на 1 dest+1 ->
dest
SUB dest, src Вычесть из dest src : dest-src -> dest
SBB dest, src Вычесть с учетом заема: dest-src-cy -> dest
DEC dest Уменьшить на единицу содержимое dest: dest-1 ->
dest
NEG dest Измeнить знак операнда: 0-dest -> dest
MUL src беззнаковое умножение:
1.Операнды восьмиразрядные (AL)*src8 -> AX
2.Операнды шестнадцатиразрядные: (AX)*src16->
72
DX:AX
IMUL src Умножение чисел со знаком (Аналогично выше)
DIV src Деление беззнаковое:
1.Восьмиразрядные операнды АХ/src8 -> AL; AX
mod src8 -> AH;
2. Шестнадцатиразрядный операнд: DX:AX / src16
-> AX; DX:AX mod src16 -> DX.
IDIV src Деление чисел со знаком — аналогично
беззнаковому
AAA Надстройка для сложения чисел в коде ASCII.
Корректирует сумму двух байтов в регистре AL.
Если правые четыре бита в регистре AL имеют
значение больше 9 или флаг AF=1, то команда
AAA прибавляет к регистру AH единицу и
устанавливает флаги AF и CY. Команда всегда
очищает четыре левых бита регистра AL.
AAS Надстройка для вычитания ASCII-чисел.
Применяется после вычитания для
преобразования AL в две цифры кода ASCII.
AAM Надстройка для умножения ASCII — чисел. Делит
содержимое регистра AL на 10, частное
помещается в регистр AH, остаток — в регистр AL.
Применяется после умножения двух чисел в коде
ASCII.
AAD Надстройка для деления ASCII. Применяется
перед делением чисел в коде ASCII. Команда
корректирует делимое в двоичное значение в
регистре AL для последующего двоичного
деления. Затем умножает содержимое регистра
AH на 10, прибавляет результат к содержимому
регистра AL и очищает AH.
DAA Десятичная надстройка для сложения.
Корректирует результат операции сложения двух
упакованных десятичных чисел с целью
получения упакованного десятичного числа.
73
DAS Десятичная надстройка для вычитания.
Корректирует результат вычитания двух
упакованных десятичных чисел с целью
получения десятичного числа.
CBW Преобразовать БАЙТ в СЛОВО. Исходный
операнд в AL, результат в AX
CWD Преобразовать СЛОВО в ДВОЙНОЕ СЛОВО.
Исходное слово в AX, результат в DX:AX
AND dest, src Логическое И: src & dest -> dest
OR dest, src Логическое ИЛИ: src OR dest -> dest
XOR dest, src Исключающее ИЛИ: dest ^ src -> dest
NOT dest Логическое НЕ: dest -> ^dest
RCL dest, count Содержимое dest циклически сдвигается влево
через флаг переноса на count двоичных разрядов.
В качестве count может использоваться
содержимое регистра СL, либо непосредственный
операнд 1.
RCR dest, count То же, но сдвиг вправо.
ROL dest, count Циклический сдвиг влево
ROR dest, count Циклический сдвиг вправо
SAL/SHL dest, count Арифметический сдвиг влево (сдвиг на один
разряд эквивалентен умножению dest на 2).
SAR dest, count Арифметический сдвиг вправо (сдвиг на один
разряд эквивалентен делению на 2)
SHR dest, count Логический сдвиг вправо на count разрядов.
Освобождающиеся разряды заполняются нулями.
7.6.2. Инструкции пересылки данных
MOV dest, src Пересылка данных: src -> dest
XCHG dest, src Oбмен содержимым операндов: dest <-> src
LEA reg16,addr Загрузка адреса : аddr -> reg16
LDS reg16,mem Загрузка сегментного регистра DS и reg16
содержимым памяти, при этом reg16 < [mem16];
74
DS < [mem16+2]
LES reg16,mem Загрузка сегментного регистра ES и reg16
содержимым памяти, при этом reg16 < [mem16];
ES < [mem16+2]
PUSH src Запись операнда в стек
PUSHF Запись регистра флагов в стек
POP src Извлечение операнда из верхушки стека
POPF Извлечение регистра флагов из верхушки стека
LAHF Загрузка младшего байта регистра флагов в
регистр AH. После выполнения операции регистр
AH содержит: значения флагов S Z * A * P * C
SAHF Загрузка младшего байта регистра флагов из
регистра AH
MOVS
MOVSB
MOVSW
Пересылает данные между областями памяти
размером до 64 K. Команда MOVS должна иметь
операнды, которые используются ассемблером
для определения типа пересылки, команды
MOVSB и MOVSW используются __________для пересылки
байтов и слов соответственно, и явных операндов
не имеют. Пересылка всегда идет из области,
адресуемой парой DS:SI в область, адресуемую
парой ES:DI. После выполнения пересылки
очередного элемента SI и DI увеличиваются
(DF=0) или уменьшаются на единицу (для байтов)
или на 2 (для слов). Операция обычно
применяется с префиксами повторений.
LODS
LODSB
LODSW
Помещает в аккумулятор (AL или AX) значение
операнда, адресуемого парой DS:SI, за тем, в
зависимости от флага DF, адрес операнда
инкрементируется или декрементируется
STOS
STOSB
STOSW
Операция, обратная LODS
IN acc, port (или DX) Чтение содержимого порта, заданного адресом
port или содержимым регистра DX, в аккумулятор
75
(AL или AX)
OUT acc, port (или
DX)
Запись в порт, заданный адресом port или
содержимым регистра DX содержимого
аккумулятора (AL или AX)
XLAT src Транслитерация. Инструкция использует AL как
смещение байта в 256-байтовой таблице,
адресуемой парой DX:BX. Указанный байт
замещает собой значение AL.
7.6.3. Инструкции переходов
JMP addr Безусловный переход по адресу addr. Может быть
далеким (межсегментным), близким (в пределах
сегмента) и коротким
JCXZ short_label Переход, если СХ=0 (только короткий).
LOOP short_label Организация цикла со счетчиком: (CX-1) -> CX,
jmp short_label, если CX<>0
LOOPE short_label
LOOPZ short_label
То же, что и LOOP, но переход в том случае, если
CX<>0 и ZF=1
LOOPNE short_label
LOOPNZ short_label
То же, что и LOOP, но переход, если CX<>0 и
ZF=0
Условные переходы.
Все условные переходы — короткие (в пределах 127/-128 байт)
Мнемоника Условие перехода Флаги
JA/JNBE Более/Не менее и не равно CF or ZF =0
JAE/JNB Более или равно/Не менее CF=0
JB/JC Менее/Перенос CF=1
JE/JZ Равно/Нуль ZF=1
76
JG/JNLE Больше/Не меньше и не равно 0 SF=0 or SF<>OF
JGE/JNL Больше или равно/Не меньше SF=0 or ZF=1
JL/JNGE Меньше/Не больше и не равно SF=1,ZF<>1
JLE/JNG Меньше или равно/Не больше ZF=0 or SF=1
JNC Нет переноса CF=0
JNE/JNZ Не равно/Не нуль ZF=0
JNO Нет переполнения OF=0
JNP/JPO Нет четности PF=0
JNS Нет знака SF=0
JO Переполнение OF=1
JP/JPE Четность PF=1
JS Знак SF=1
Инструкции работы с подпрограммами и прерываниями
INT type Переход к прерыванию типа type
INTO Прерывание по переполнению. Вызывает прерывание по
вектору 4 в случае, если установлен флаг переполнения
IRET Возврат из прерывания
CALL addr Переход к подпрограмме
RET Возврат из подпрограммы
RETF Возврат из far процедуры
RET n Возврат с удалением n элементов из верхушки стека
7.6.4. Управление состоянием процессора
CMP dest, src Сравнить dest и src и установить регистр флагов,
операнды не изменяются
TEST dest, src dest&src и установить регистр флагов, операнды не
изменяются
SCAS Сканировать строку. Сравнивается содержимое
77
SCASB
SCASW
аккумулятора и элемент, указываемый текущим
значением пары ES:DI, соответствующим образом
устанавливается регистр флагов. После чего значение DI
увеличивается для выборки следующего элемента.
CLC Очистить флаг переноса
STC Установить флаг переноса
CLI Запретить прерывания
STI Разрешить прерывания
CMC Инвертировать флаг переноса (CY)
CLD Очистить флаг направления (установить его в 0 или UP)
(для строковых операций)
STD Установить флаг направления (установить его в 1 или
DN)(для строковых операций)
HLT Остановить процессор
WAIT Перевести процессор в состояние ожидания внешнего
прерывания или сброса
LOCK Блокировка шины на время выполнения следующей
команды
SEG: Установить сегмент для последующей адресации
(префикс)
mas dw 10 dup(?) ; резервирование 10 слов под элементы
lea bx, mas ; в bx запишем адрес массива mas
mov ax,8 ; в ax – начальное значение элемента
mov si,0 ; в si будем хранить смещение текущего
; элемента массива относительно начала массива, для первого
; элемента в si запишем ноль
mov cx,10 ; сх поместим счетчик цикла
cycl: mov [bx][si],ax ; формирование очередного элемента
inc ax ; увеличим текущее значение
add si,2 ; переход к следующему элементу
loop cycl ; если счетчик не ноль, то на cycl