Жанр: Учеба
Ассемблер и программирование для IBM PC
...тр/память) совместно с битами mod определяют
способ адресации, как показано на рис.25.2.
__________________________________________________________________________
r/m mod=00 mod=01 mod=10 mod=1.1 mod=11
w=0 w=1
000 BX+SI BX+SI+disp BX+SI+disp AL AX
001 BX+DI BX+DI+disp BX+DI+disp CL CX
010 BP+SI BP+SI+disp BP+SI+disp DL DX
011 BP+DI BP+DI+disp BP+DI+disp BL BX
100 SI SI+disp SI+disp AH SP
101 DI DI+disp DI+disp CH BP
110 Direct BP+disp BP+disp DH SI
111 BX BX+disp BX+disp BH DI
__________________________________________________________________________
Рис.25.2. Биты r/m
ДВУХБАЙТОВЫЕ КОМАНДЫ
________________________________________________________________
Рассмотрим пример сложения содержимого регистров BХ и АХ:
ADD BX,AX 0000 0011 11 011 000
dw mod reg r/m
d 1 означает, что биты reg и w описывают операнд 1 (BХ), а биты
mod, r/m и w - Операнд 2 (АХ);
w 1 определяет размер регистров в одно слово,
mod 11 указывает, что операнд 2 является регистром;
reg 011 указывает, что операнд 1 является регистром BХ;
r/m 000 указывает, что операнд 2 является регистром AX.
Рассмотрим пример умножения регистра AL на регистр BL:
MUL BL 11110110 11 100 011
w mod reg r/m
Команда MUL предполагает, что регистр AL содержит множимое. Размер
регистра равен одному байту (w = 0), mod указывает на регистровую
операцию, г/m = 011 указывает на регистр BL. В данном случае reg = 100 не
имеет смысла.
ТРЕХБАЙТОВЫЕ КОМАНДЫ
________________________________________________________________
Следующая команда MOV генерирует три байте машинного кода:
MOV mem,AX 10100001 dddddddd dddddddd
Для команды пересылки из регистра АХ или AL необходимо знать, сколько
байтов участвует в операции: один или два. В данном примере w = 1 означает
слово, следовательно, предполагается 16-битовый регистр АХ. Использование
во втором операнде регистра AL приведет к значению бита w = 0. Байты 2 и 3
содержат относительный адрес памяти. Команды, использующие регистры АХ или
AL, часто генерируют более эффективный (короткий) машинный код.
ЧЕТЫРЕХБАЙТОВЫЕ КОМАНДЫ
________________________________________________________________
Рассмотрим пример умножения регистра AL на значение в памяти.
Процессор предполагает, что множимое находится в регистре AL для
однобайтового умножения и в регистре АХ для Двухбайтового умножения:
MUL mem_byte 11110110 00 100 110
w mod reg r/m
Для данной команды reg всегда имеет значение 100, mod = 00 указывает на
операцию с памятью, a r/m=110 - на прямой способ адресации. Машинная
команда также содержит два следующих байта, определяющих относительный
адрес памяти.
Рассмотрим еще один пример, иллюстрирующий команду LEA, которая
всегда специфицирует двухбайтовый адрес:
LEA DX,mem 10001101 00 010 110
LEA mod rеg r/m
Reg =010 означает регистр DX. Mod =00 и r/m=110 определяют прямой
способ адресации памяти. В следующих двух байтах содержится относительный
адрес.
КОМАНДЫ В АЛФАВИТНОМ ПОРЯДКЕ
________________________________________________________________
В данном разделе представлен набор команд Ассемблера в алфавитном
порядке. Некоторые команды, например сдвиг и циклический сдвиг, для
краткости сгруппированы. Ряд специальных команд для процессоров 80186,
80286 и 80386 выходят за рамки данной книги и поэтому в данной главе также
отсутствуют. При пояснении команд и способов адресации используются
следующие сокращения:
addr адрес памяти;
addr-high первый байт адреса (старший);
addr-low левый (младший) байт. адреса;
data непосредственный операнд (8 бит при w=0 и 16 бит при w= 1);
data-high правый (старший) байт непосредственного операнда;
data-low левый (младший) байт непосредственного операнда;
disp смещение (относительный адрес);
rеg ссылка на регистр.
AAA: Коррекция ASCII-формата для сложения
-------------------------------------------
О п е р а ц и я: Корректирует сумму двух ASCII-байтов в регистре AL.
Если правые четыре бита регистра AL имеют значение больше 9 или флаг AF
установлен в 1, то команда AAA прибавляет к регистру АН единицу и
устанавливает флаги AF и CF. Команда всегда очищает четыре левых бита в
регистре AL.
Ф л а г и: Команда воздействует на флаги AF и CF (флаги OF, PF, SF и
ZF не определены).
О б ъ е к т н ы й к о д: 00110111 (без операндов).
AAD: Коррекция ASCII-формата для деления
------------------------------------------
О п е р а ц и я: Корректирует ASCII-величины для деления. Команда AAD
используется перед делением неупакованных десятичных чисел в регистре АХ
(удаляет тройки ASCII-кода). Эта команда корректирует делимое в двоичное
значение в регистре AL для последующего двоичного деления. Затем умножает
содержимое регистра АН на 10. прибавляет результат к содержимому регистра
AL и очищает АН. Команда AAD не имеет операндов.
Ф л а г и: Команда воздействует на флаги PF, CF, ZF (флаги AF CF и OF
не определены).
О б ъ е к т н ы й к о д: |11010101|00001010|.
AАМ: Коррекция ASCII-формата для умножения
--------------------------------------------
О п е р а ц и я: Команда AAM используется для коррекции результата
умножения двух неупакованных десятичных чисел. Команда делит содержимое
регистра AL на 10, записывает частное в регистр АН, а остаток в регистр
AL.
Ф л а г и: Команда воздействует на флаги PF, SF и ZF (флаги AF CF и
OF не определены).
О б ъ е к т н ы й к о д: |11010100|00001010| (без операндов).
AAS: Коррекция ASCII-формата для вычитания
--------------------------------------------
О п е р а ц и я: Корректирует разность двух ASCII-байтов в регистре
AL. Если первые четыре бита имеют значение больше 9 или флаг CF установлен
в 1, то команда AAS вычитает 6 из регистра AL и 1 из регистра АН, флаги AF
и CF при этом устанавливаются в 1. Команда всегда очищает левые четыре
бита в регистре AL.
Ф л а г и: Команда воздействует на флаги AF и CF (флаги OF PF SF и ZF
не определены).
О б ъ е к т н ы й к о д: 00111111 (без операндов).
ADC: Сложение с переносом
---------------------------
О п е р а ц и я: Обычно используется при сложении многословных
величин для учета бита переполнения в последующих фазах операции. Если
флаг CF установлен в 1, то команда ADC сначала прибавляет 1 к операнду 1.
Команда всегда прибавляет операнд 2 к операнду 1, аналогично команде ADD.
Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF.
О б ъ е к т н ы й к о д (три формата):
Регистр плюс регистр или память:
|000100dw|modregr/m|
Регистр АХ (AL) плюс непосредственное значение:
|0001010w|-- data--|data, если w=1|
Регистр или память плюс непосредственное значение:
y100000sw|mod010r/m|--data--|data, если sw=01|
ADD: Сложение двоичных чисел
------------------------------
О п е р а ц и я: Прибавляет один байт или одно слово в памяти,
регистре или непосредственно к содержимому регистра или прибавляет один
байт или слово в регистре или непосредственно к памяти.
Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF.
О б ъ е к т н ы й к о д (три формата):
Регистр плюс регистр или память:
|000000dw|modregr/rm|
Регистр AX (AL) плюс непосредственное значение:
|0000010w|--data--|data, если w=1|
Регистр или память плюс непосредственное значение:
|100000sw|mod000r/m|--data--|data, если BW=01|
AND: Логическое И
-------------------
О п е р а ц и я: Команда выполняет поразрядную конъюнкцию (И) битов
двух операндов. Операнды представляют собой одно- или двухбайтовые
величины в регистре или памяти. Второй операнд может содержать
непосредственные данные. Команда AND проверяет два операнда поразрядно.
Если два проверяемых бита равны 1, то в первом операнде устанавливается
единичное значение бита, в других случаях - нулевое. См. также команды OR,
XOR и TEST.
Ф л а г и: Команда воздействует на флаги CF, OF, PF, SF и ZF (флаг AF
не определен).
О б ъ е к т н ы й к о д (три формата):
Регистр И регистр или память:
|001000dw|modregr/m|
Регистр AX (AL) И непосредственное значение:
|0010010w|--data--|data, если w=1|
Регистр или память И непосредственное значение:
|1010000w|modl00r/m|--data--|data, если w=1|
CALL: Вызов процедуры
-----------------------
О п е р а ц и я: Выполняет короткий или длинный вызов процедуры для
связи подпрограмм. Для возврата из процедуры используется команда RET.
Команда CALL уменьшает содержимое SP на 2 и заносит в стек адрес следующей
команды (из IP), а затем устанавливает в регистре IP относительный адрес
процедуры. Впоследствии команда RET использует значение в стеке для
возврата. Существует четыре типа команды CALL для вызова внутри сегмента и
между сегментами. Команда межсегментного вызова сначала уменьшает SP,
заносит в стек адрес из регистра CS, а затем загружает в стек
внутрисегментный указатель.
Ф л а г и: Не меняются.
О б ъ е к т н ы й к о д (четыре формата):
Прямая адресация в сегменте:
|11101000|disp-low|diep-high|
Косвенная адресация в сегменте:
|11111111|mod010r/m|
Косвенная адресация между сегментами:
|11111111|mod011r/m|
Прямая адресация между сегментами:
|10011010|offset-low|offset-high|seg-low|seg-high|
CBW: Преобразование байта в слово
-----------------------------------
О п е р а ц и я: Расширяет однобайтовое арифметическое значение в
регистре AL до размеров слова. Команда CBW размножает знаковый бит (7) в
регистре AL по всем Битам регистра АН. См также команду CWD.
Ф л а г и: Не меняются.
О б ъ е к т н ы й к о д: 10011000 (без операндов).
CLC: Сброс флага переноса
---------------------------
О п е р а ц и я: Устанавливает значение флага переноса, равное 0, так
что, например, команда ADC не прибавляет единичный бит. Команда CLC не
имеет операндов. См. также команду STD.
Ф л а г и: Команда воздействует на флаг CF (устанавливается в 0).
О б ъ е к т н ы й к о д: 11111000.
CLD: Сброс флага направления
-------------------------------
О п е р а ц и я: Устанавливает значение флага направления, равное 0.
В результате такие строковые операции, как CMPS или MOVS обрабатывают
данные слева направо. См. также команду STD.
Ф л а г и: Команда воздействует на флаг DF (устанавливается в 0).
О б ъ е к т н ы й к о д: 11111100 (без операндов).
CLI: Сброс флага прерывания
-----------------------------
О п е р а ц и я: Запрещает маскируемые внешние прерывания по
процессорной шине INTR посредством установки значения флага прерывания IF
в 0. См. также команду STI.
Ф л а г и: Команда воздействует на флаг IF (устанавливается в 0).
О б ъ е к т н ы й к о д: 11111010 (без операндов).
CMC: Переключение флага переноса
----------------------------------
О п е р а ц и я: Инвертирует флаг CF, т.е. преобразует нулевое
значение флага CF в единичное и наоборот.
Ф л а г и: Команда воздействует на флаг CF (инвертируется).
О б ъ е к т н ы й к о д: 11110101 (без операндов).
CMP: Сравнение
----------------
О п е р а ц и я: Сравнивает содержимое двух полей данных. Фактически
команда CMP вычитает второй операнд из первого, но содержимое полей не
изменяет. Операнды должны иметь одинаковую длину: байт или слово. Команда
CMP может сравнивать содержимое регистра, памяти или непосредственное
значение с содержимым регистра; или содержимое регистра или
непосредственное значение с содержимым памяти. См. также команду CMPS.
Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF.
О б ъ е к т н ы й к о д (три формата):
Регистр или память с регистром:
|001110dw|modregr/m|
Непосредственное значение с регистром AX (AL):
|0011110w|--data--|data, если w=1|
Непосредственное значение с регистром или памятью:
|100000sw|mod111r/m|--data--|data, если sw=0|
CMPS/CMPSB/CMPSW: Сравнение строк
-----------------------------------
О п е р а ц и я: Сравнивают строки любой длины. Этим командам обычно
предшествует префикс REPn, например REPE CMPSB. Команда CMPSB сравнивает
память по байтам, а команда CMPSW - по словам. Первый операнд этих команд
адресуется регистровой парой DS:SI, а второй - регистровой парой ES:DI.
Если флаг DF установлен в 0, то сравнение происходит слева направо,
регистры SI и DI при этом увеличиваются после каждого сравнения. Если флаг
DF установлен в 1, то сравнение происходит справа налево, а регистры SI и
DI при этом уменьшаются после каждого сравнения.
Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF.
О б ъ е к т н ы й к о д: 1010011w.
CWD: Преобразование слова в двойное слово
-------------------------------------------
О п е р а ц и я: Расширяет арифметическое значение в регистре АХ до
размеров двойного слова в регистровой паре DX:AX, дублируя при этом
знаковый бит (15-й бит в регистре АХ) через регистр DX. Обычно
используется для получения 32-битового делимого. См. также команду CBW.
Ф л а г и: Не меняются.
О б ъ е к т н ы й к о д: 10011001 (без операндов).
DAA: Десятичная коррекция для сложения
----------------------------------------
О п е р а ц и я: Корректирует результат сложения двух BCD (десятичных
упакованных) элементов в регистре AL. Если четыре правых бита имеют
значение больше 9 или флаг AF установлен в 1, то команда DAA прибавляет 6
к регистру AL и устанавливает флаг AF. Если регистр AL содержит значение
больше, чем 9F, или флаг CF установлен в 1, то команда DAA прибавляет 60Н
к регистру AL и устанавливает флаг CF. См. также команду DAS.
Ф л а г и: Команда воздействует на флаги AF. CF, PF, SF и 2F (флаг OF
неопределен).
О б ъ е к т н ы й к о д: 00100111 (без операндов).
DAS: Десятичная коррекция для вычитания
-----------------------------------------
О п е р а ц и я: Корректирует результат вычитания двух BCD
(десятичных упакованных) чисел в регистре AL. Если четыре правых бита
имеют значение больше 9 или флаг AF установлен в 1, то команда DAS
вычитает 60Н из регистра AL и устанавливает флаг CF. См. также команду
DAA.
Ф л а г и: Команда воздействует на флаги AF, CF, PF, SF и ZF.
О б ъ е к т н ы й к о д: 00101111 (без операндов).
DEC: Декремент
----------------
О п е р а ц и я: Вычитает 1 из байта или слова в регистре или в
памяти например DEC СХ. См. также команду INC.
Ф л а г и: Команда воздействует на флаги AF, OF, PF, SF и ZF.
О б ъ е к т н ы й к о д (два формата):
Регистр: |01001reg|
Регистр или память: |1111111w|mod001r/m|
DIV: Деление
--------------
О п е р а ц и я: Выполняет деление беззнакового делимого (16 или 32
бит) на беззнаковый делитель (8 или 16 бит). Левый единичный бит
рассматривается как бит данных, а не как минус для отрицательных чисел.
Для 16-битового деления делимое должно находиться в регистре АХ, а
8-битовый делитель возможен в регистре или в памяти, например DIV BH.
Частное от деления получается в регистре AL, а остаток - в регистре АН.
Для 32-битового деления делимое должно находиться в регистровой паре DX:AX
а 16-битовый делитель возможен в регистре или в памяти, например DIV СХ.
Частное от деления получается в регистре АХ, а остаток - в регистре DX.
См. также команду IDIV.
Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF SF и ZF (все
не определены).
О б ъ е к т н ы й к о д: |1111011w|mod110r/m|
ESC: Переключение на сопроцессор
----------------------------------
О п е р а ц и я: Обеспечивает использование сопроцессора для
выполнения специальных операций. Для выполнения арифметических операций
над числами с плавающей запятой используются сопроцессоры 8087 или 80287.
Команда ESC передает в сопроцессор инструкцию и операнд для выполнения
необходимой операции.
Ф л а г и: Не меняются.
О б ъ е к т н ы й к о д: |11011xxx|modxxxr/m| (x - любое знач.).
HLT: Останов микропроцессора
------------------------------
О п е р а ц и я: Приводит процессор в состояние останова, в котором
происходит ожидание прерывания. При завершении команды HLT регистры CS:IP
указывают на следующую команду. При возникновении прерывания процессор
записывает в стек регистры CS и IP и выполняет подпрограмму обработки
прерывания. При возврате из подпрограммы команда IRET восстанавливает
регистры CS и IP из стека и управление передается на команду, следующую за
командой HLT.
Ф л а г и: Не меняются.
О б ъ е к т н ы й к о д: 11110100 (без операндов).
IDIV: Целое деление знаковых величин
--------------------------------------
О п е р а ц и я: Выполняет деление знакового делимого (16 или 32 бит)
на знаковый делитель (8 или 16 бит). Левый единичный бит рассматривается
как знак минус для отрицательных чисел. Для 16-битового деления делимое
должно находиться в регистре АХ, a 8-битовый делитель возможен в регистре
или в памяти, например IDIV DL. Частное от деления получается в регистре
AL, а остаток - в регистре АН. Для 32-битового деления делимое должно
находиться в регистровой паре DX:AX, а 16-битовый делитель возможен в
регистре или в памяти, например IDIV BX. Частное от деления получается в
регистре АХ, а остаток - в регистре DX. См. команды CBW и CWD для
расширения знакового делимого, а также команду DIV.
Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF.
О б ъ е к т н ы й к о д: |1111011w|mod111r/m|
IMUL: Целое умножение знаковых величин
----------------------------------------
О п е р а ц и я: Выполняет умножение на знаковый множитель (8 или 16
бит). Левый единичный бит рассматривается как знак минус для отрицательных
чисел. Для 8-битового умножения множимое должно находиться в регистре AL,
а множитель возможен в регистре или в памяти, например IMUL BL.
Произведение получается в регистре АХ. Для 16-битового умножения множимое
должно находиться в регистре АХ, а множитель возможен в регистре или в
памяти, например IMUL BX. Произведение получается в регистровой паре
DX:AX. См. также команду MUL.
Ф л а г и: Команда воздействует на флаги CF и OF (флаги AF PF SF и ZF
не определены).
О б ъ е к т н ы й к о д: |1111011w|mod101r/m|
IN: Ввод байта или слова из порта
-----------------------------------
О п е р а ц и я: Передает из вводного порта один байт в регистр AL
или два байта в регистр АХ). Порт кодируется как фиксированный числовой
операнд (IN АХ,порт#) или как переменная в регистре DX (IN AX,DX).
Процессоры 80186, 80286 и 80386 имеют, кроме того, команду INS (Input
String - ввод строки). См. также команду OUT.
Ф л а г и: Не меняются.
О б ъ е к т н ы й к о д (два формата):
Переменный порт: |1110110w|
Фиксированный порт: |1110010w|--port--|
INC: Инкремент
----------------
О п е р а ц и я: Прибавляет 1 к байту или слову в регистре или в
памяти, например INC СХ. См. также команду DEC.
Ф л а г и: Команда воздействует на флаги AF, OF, PF, SF и ZF.
О б ъ е к т н ы й к о д (два формата):
Регистр: |01000reg|
Регистр или память: |1111111w|mod000r/m|
INT: Прерывание
-----------------
О п е р а ц и я: Прерывает выполнение программы и передает управление
по одному из 256 адресов (векторов прерывания). Команда INT выполняет
следующее: 1) уменьшает значение SP на 2 и заносит в стек флаговый
регистр, сбрасывает флаги IF и TF; 2) уменьшает значение SP на 2 и заносит
регистр CS в стек, старшее слово из вектора прерывания помещает в регистр
CS; 3) уменьшает значение SP на 2 и заносит регистр IP в стек, младшее
слово из вектора прерывания помещает в регистр IP.
Ф л а г и: Команда воздействует на флаги IF и TF.
О б ъ е к т н ы й к о д:
|1100110v|--type--| (если v = 0, то type = 3).
INTO: Прерывание по переполнению
----------------------------------
О п е р а ц и я: Приводит к прерыванию при возникновении переполнения
(флаг OF установлен в 1) и выполняет команду IRET 4. Адрес подпрограммы
обработки прерывания (вектор прерывания) находится по адресу 10Н. См.
также команду INT.
Ф л а г и: Не меняются.
О б ъ е к т н ы й к о д: 11001110 (без операндов).
IRET: Возврат из обработки прерывания
---------------------------------------
О п е р а ц и я: Обеспечивает возврат из подпрограммы обработки
прерывания. Команда IRET выполняет следующее: 1) помещает слово из вершины
стека в регистр IP и увеличивает значение SP на 2; 2) помещает слово из
вершины стека в регистр CS и увеличивает значение SP на 2; 3) помещает
слово из вершины стека во флаговый регистр и увеличивает значение SP. на
2. См. также команду RET.
Ф л а г и: Команда воздействует на все флаги.
О б ъ е к т н ы й к о д: 11001111 (бег операндов).
JA/JNBE: Переход по "выше" или "не ниже или равно"
----------------------------------------------------
О п е р а ц и я: Используется после проверки беззнаковых данных для
передачи управления по другому адресу. Если флаг CF равен нулю (нет
переноса) и флаг ZF равен нулю (не нуль), то команда прибавляет к регистру
IP значение операнда (относительное смещение) и выполняет таким образом
переход.
Ф л а г и: Не меняются.
О б ъ е к т н ы й к о д: |01110111|--disp--|
JAE/JNB: Переход по "выше или равно" или "не ниже"
----------------------------------------------------
О п е р а ц и я: Используется после проверки беззнаковых данных для
передачи управления по другому адресу. Если флаг CF равен нулю (нет
переноса), то команда прибавляет к регистру IP значение операнда
(относительное смещение) и выполняет таким образом переход.
Ф л а г и: Не меняются.
О б ъ е к т н ы й к о д: |01110011|--disp--|
JB/JNAE: Переход по "ниже" или "не выше или равно"
----------------------------------------------------
О п е р а ц и я: Используется после проверки беззнаковых данных для
Передачи управления по другому адресу. Если флаг CF равен единице (есть
перенос), то команда прибавляет к регистру IP значение операнда
(относительное смещение) и выполняет таким образом переход.
Ф л а г и: Не меняются.
О б ъ е к т н ы й к о д: |01110010|--disp--|
JBE/JNA: Переход по "ниже или равно" или "не выше"
----------------------------------------------------
О п е р а ц и я: Используется после проверки беззнаковых данных для
передачи управления по другому адресу. Если флаг CF равен единице (есть
перенос) или флаг AF равен единице, то команда прибавляет к регистру IP
значение операнда (относительное смещение) и выполняет таким образом
переход.
Ф л а г и: Не меняются.
О б ъ е к т н ы й к о д: |01110110|--disp--|
JC: Переход по переносу
-------------------------
О п е р а ц и я: Идентична JB/JNAE.
JCXZ: Переход по "CX равно нулю"
----------------------------------
О п е р а ц и я: Выполняет передачу управления по указанному в
операнде адресу, если значение в регистре CX равно нулю. Команда JCXZ
может быть полезна в начале циклов LOOP.
Ф л а г и: Не меняются.
О б ъ е к т н ы й к о д: |11100011|--disp--|
JE/JZ: Переход по "равно" или по "нулю"
О п е р а ц и я: Используется после проверки знаковых или беззнаковых
данных для передачи управления по другому адресу. Если флаг ZF равен
единице (нулевое состояние), то команда прибавляет к регистру IP значение
операнда (относительное смещение) и выполняет таким образом переход.
Ф л а г и: Не меняются.
О б ъ е к т н ы й к о д: |01110100|--disp--|
JG/JNLE: Переход по "больше" или "не меньше или равно"
--------------------------------------------------------
О п е р а ц и я: Используется после проверки знаковых данных для
передачи управления по другому адресу. Если флаг ZF равен нулю (не нуль) и
флаги SF и OF одинаковы (оба 0 или оба 1), то команда прибавляет к
регистру IP значение операнда (относительное смещение) и выполняет таким
образом переход.
Ф л а г и: Не меняются.
О б ъ е к т н ы й к о д: |01111111|--disp--|
JGE/JNL: Переход по "больше или равно" или "не меньше"
---------------------------------------------
...Поділитися у соцмережах