Пересылка (копирование) данных из регистра, памяти или непосредственного операнда в регистр или память
XCHG r/m, reg
Обмен данными (взаимный) между регистрами или регистром и памятью
BSWAP reg32
Перестановка байтов в регистре из порядка младший-старший в порядок старший-младший (486+)
MOVSXB reg, r/m
Копирование байта с расширением до слова или двойного слова, заполняя старшие биты знаком (386+)
MOVSXW reg, r/m
Копирование слова с расширением до двойного слова, заполняя старшие биты знаком (386+)
MOVZXB reg, r/m
Копирование байта с расширением до слова или двойного слова, заполняя старшие биты нулем (386+)
MOVZXB reg, r/m
Копирование слова с расширением до двойного слова, заполняя старшие биты нулем (386+)
XLAT
Трансляция (перекодирование) содержимого AL в значение из таблицы трансляции, адресуемой в (Е)BX: AL ← [(E)BX+AL]
LEA reg16/32, mem
Загрузка эффективного адреса в регистр
LDS reg16/32, mem
Загрузка в регистр (двойного) слова из памяти, а в
DS – следующего 16-ти битового слова
LES reg16/32, mem
Загрузка в регистр (двойного) слова из памяти, а в
ES – следующего 16-ти битового слова
LFS reg16/32, mem
Загрузка в регистр (двойного) слова из памяти, а в
FS – следующего 16-ти битового слова
LGS reg16/32, mem
Загрузка в регистр (двойного) слова из памяти, а в
GS – следующего 16-ти битового слова
LSS reg16/32, mem
Загрузка в регистр (двойного) слова из памяти, а в
SS – следующего 16-ти битового слова
IN AL(AX), port8
Ввод в AL (или AX,EAX) из порта с адресом port8
IN AL(AX), DX
Ввод в AL (или AX,EAX) из порта с адресом, хранящимся в DX
OUT port8, AL(AX)
Вывод из AL (или AX,EAX) в порт с адресом port8
OUT DX, AL(AX)
Вывод из AL (или AX,EAX) в порт с адресом, хранящимся в DX
6. Перечислите арифметические и логические команды.
Таблица 6.1 - Команды работы со стеком
PUSH r/m
Помещение (двойного) слова из регистра или памяти в стек
PUSH immed
Помещение непосредственного операнда в стек (286+)
PUSHA (D)
Помещение в стек регистров AX,CX,DX,BX,SP,BP,SI,DI (286+) или их 32-х битовых расширений (386+)
POP r/m
Извлечение (двойного) слова данных из стека в регистр или память
POPA (D)
Извлечение данных из стека в регистры DI,SI, BP,SP,BX,DX,CX,AX (286+) или их 32-х битовых расширений (386+)
PUSHF (D)
Помещение в стек регистра флагов FLAGS (EFLAGS)
POPF (D)
Извлечение данных из стека в регистр флагов FLAGS (EFLAGS)
Таблица 6.2 - Команды целочисленной арифметики
ADD r/m, r/m/i
Сложение двух операндов: r/m ← (r/m + r/m/i)
XADD r/m, reg
Обмен и сложение (486+)
ADC r/m, r/m/i
Сложение двух операндов с учетом переноса от предыдущей операции: r/m ← (r/m + r/m/i + CF)
INC r/m
Увеличение на 1: r/m ← (r/m + 1)
SUB r/m, r/m/i
Вычитание: r/m ← (r/m - r/m/i)
SBB r/m, r/m/i
Вычитание с заемом: r/m ← (r/m – r/m/i – CF)
DEC r/m
Уменьшение на 1: r/m ← (r/m – 1)
CMP r/m, r/m/i
Сравнение – вычитание без сохранения результата (только установка флагов)
CMPXCHG r/m, reg
Сравнение и обмен данными (486+)
CMPXCHG8B
Сравнение и обмен 8 байт (PENTIUM+)
NEG r/m
Изменение знака операнда (преобразование в дополни-тельном коде): r/m ← (0 – r/m)
MUL r/m
Умножение AL/AX/EAX на беззнаковое целое значение из r/m
IMUL r/m
Умножение AL/AX/EAX на целое знаковое значение из r/m
IMUL reg16/32, r/m
Знаковое умножение reg16/32 на r/m (помещение результата без расширения разрядности в reg16/32) (16 бит – 286+; 32 бита – 386+)
IMUL
reg16/32, r/m,
immed
Знаковое умножение r/m на 16/32-х битовый непосредственный операнд и помещение результата без расширения разрядности в reg16/32 (16 бит – 286+; 32 бита – 386+)
DIV r/m
Деление расширенного аккумулятора на беззнаковое число из r/m
IDIV r/m
Знаковое деление расширенного аккумулятора на знаковое целое из r/m
CBW
Знаковое расширение байта в аккумуляторе (AL) до слова: AH ← заполняется битом AL[7]
CWD
Преобразование слова в двойное слово (расширение знака AX в DX) DX ← заполняется битом AX[15]
CWDE
EAX [16¼31] ← заполняется битом AX [15]
CDQ
Преобразование двойного слова в – счетверенное:
EDX ← заполняется битом EAX [31]
DAA
Коррекция AL после BCD-сложения
DAS
Коррекция AL после BCD-вычитания
AAA
Коррекция AL после ASCII-сложения
AAS
Коррекция AL после ASCII-вычитания
AAM
Коррекция AL после ASCII-умножения
AAD
Коррекция AL,AH перед ASCII-делением
7. Где расположены операнды в командах умножения и деления? Куда записываются результаты умножений и делений?
В одноадресных командах MUL и IMUL один из сомножителей по умолчанию размещается в аккумуляторе (см. табл. 7.1), а второй сомножитель указан в команде. Результат умножения в два раза длиннее операндов.
Таблица 7.1 – Размещение первого множителя и результата умножения
Разрядность
Операндов
Множитель
Результат
Старшая часть
Младшая часть
AL
AH
AL
AX
DX
AX
EAX
EDX
EAX
При двухадресной форме (IMUL reg16/32,r/m) или трехадресной форме (IMUL reg16/32, r/m, immed) команд умножения со знаком – результат размещается в регистре-приемнике. В этом случае старшие 16 (или 32) разряда произведения при умножении 16-ти (или 32-х) разрядных операндов теряются. Такие команды удобно применять для вычисления адресов элементов массивов.
Команды деления DIV и IDIV имеют только одноадресную форму, причем разрядность делимого (см. табл. 7.2) должна вдвое превышать разрядность делителя, указанного в команде.
Знак остатка при выполнении команды IDIV устанавливается равным знаку делимого.
Таблица 7.2 – Размещение делимого и результатов деления
Разрядность
Делителя
Делимое
Частное
Остаток
Старшие разряды
Младшие разряды
AH
AL
AL
AH
DX
AX
AX
DX
EDX
EAX
EAX
EDX
Для подготовки операнда-делимого двойной длины используются команды расширения аккумулятора знаковыми битами. При выполнении команд – CBW / CWDE (преобразование байта в слово / преобразование слова в двойное слово с расширением в аккумуляторе) – расширенный операнд остается в аккумуляторе. Команды – CWD / CDQ (преобразование слова в двойное слово / преобразование двойного слова в счетверенное слово) – расширяют аккумулятор AX или EAX в регистры DX или EDX соответственно, куда заносится старшая половина (расширенный знак) операнда.
8. Какие команды позволяют обрабатывать десятичные данные без перевода их в двоичный формат?
Команда DAA – ДЕСЯТИЧНОЙ КОРРЕКЦИИ АККУМУЛЯТОРА ПОСЛЕ СЛОЖЕНИЯ BCD-чисел выполняет действия над содержимым AL
DAS – ДЕСЯТИЧНАЯ КОРРЕКЦИЯ ПОСЛЕ ВЫЧИТАНИЯ BCD-чисел:
Команда ААА выполняет коррекцию числа в регистре AL, полученного в результате сложения двух распакованных десятичных операндов
Команда AAS выполняет коррекцию числа в регистре AL, полученного в результате вычитания двух распакованных десятичных операндов.
Команда AAM выполняет коррекцию числа в регистре AL, полученного после умножения двух распакованных десятичных операндов.
Команда AAD производит коррекцию делимого ДО ВЫПОЛНЕНИЯ команды деления.
9. Как выполняются команды сдвигов?
Команды сдвигов и циклических сдвигов выполняют сдвиг 8/16/32-х битового операнда на 1 бит или на произвольное число бит (но не больше длины операнда). Для сдвигов более, чем на один бит, число сдвигов может быть записано предварительно в регистр CL или задано непосредственным операндом в команде (286+). Во всех командах сдвигов последний выдвигаемый бит помещается во флаг CF.
В командах двойного сдвига операндом-приемником (dest) может быть содержимое reg16/32 или mem16/32, операндом-источником (src) – только содержимое РОНа (с разрядностью 16/32). Для сдвигов более, чем на один бит, число сдвигов может быть записано предварительно в регистр CL или задано непосредственным операндом в команде.
Внутри процессора операнды dest и src объединяются в промежуточном регистре двойной длины, содержимое которого логически сдвигается влево или вправо. После сдвига в операнд-приемник (dest) помещаются соответствующие сдвинутые биты промежуточного регистра. Содержимое операнда-источника (src) не изменяется. Можно сказать, что в этих командах сдвигается операнд-приемник (dest) и в его освобождающиеся биты «вдвигается» содержимое операнда-источника (src).
10. Перечислите цепочечные (строковые) команды и особенности их выполнения.
- Цепочечный примитив MOVSB (MOVSW, MOVSD) – передает элемент цепочки – пересылает байт (слово или двойное слово) из ячейки памяти, смещение которой находится в регистре (E)SI (подразумевается, что цепочка-источник по умолчанию находится в текущем сегменте данных, определяемом регистром DS, но допускается замена сегмента), в ячейку памяти со смещением из (E)DI (цепочка-получатель должна находится только в сегменте, определяемом регистром ES).
- Команда сравнения цепочек CMPSB (CMPSW, CMPSD) – производит вычитание байта (слова или двойного слова) цепочки приемника (dest) из соответствующего элемента цепочки-источника (src).
- Команда сканирования цепочек SCASB (SCASW, SCASD) – производит вычитание элемента цепочки (байт, слово или двойное слово) из содержимого аккумулятора AL/AX/EAX. В зависимости от результатов вычитания устанавливаются флаги, но значения операндов не изменяется
- Команда LODSB (LODSW, LODSD) загружает в аккумулятор (AL/AX/EAX) элемент из цепочки (байт, слово или двойное слово) и продвигает указатель (E)SI на следующий элемент.
- Команда сохранения аккумулятора в цепочке STOSB (STOSW, STOSD) – передает байт (слово или двойное слово) из аккумулятора AL/AX/EAX в элемент цепочки и продвигает регистр-указатель (E)DI на следующий элемент. С префиксом повторения REP эта команда удобна для инициализации цепочки на фиксированное значение.
- Команды ввода и вывода цепочек INSB (INSW, INSD) и OUTSB (OUNSW, OUNSD) как и обычные команды ввода/вывода являются привилегированными.
Команда INS вводит данные из порта, адресуемого регистром DX, в ячейку памяти с адресом ES:(E)DI. После ввода операнда производится модификация регистра (E)DI на 1, 2 или 4 с учетом состояния флага направления DF.
Команда OUTS выводит данные из ячейки памяти с адресом DS:(E)SI в выходной порт, адрес которого находится в регистре DX. После вывода операнда производится коррекция указателя (E)SI.
Обе эти команды могут использоваться с префиксом повторения REP. В этом случае ввод или вывод данных повторяется до обнуления регистра-счетчика (E)CX.
11. Как выполняются команды условных и безусловных переходов?
КОМАНДА БЕЗУСЛОВНОГО ПЕРЕХОДА с общей мнемоникой JMP имеет 5 форм, различающихся расстоянием до адреса назначения от текущей команды и способом задания назначения (целевого адреса – target).
· В коротком (SHORT) внутрисегментном переходе двухбайтовая команда JMP rel8 содержит во втором байте смещение в дополнительном коде (максимально возможный переход: назад – 128 или вперед +127 от адреса команды, находящейся после команды JMP).
· Команда прямого внутрисегментного перехода (NEAR) аналогична предыдущей, но полное смещение в дополнительном коде содержит 16 (или 32 бита), которое прибавляется к текущему значению (E)IP. Эта форма команды передает управление в любую точку текущего сегмента кода.
· В команде косвенного внутрисегментного перехода JMP r/m адрес целевого назначения (target) загружается в (E)IP из регистра или ячейки памяти.
· Команда прямого межсегментного перехода JMP prt содержит непосредственный операнд, содержащий: 16-ти битовый селектор, который загружается в регистр CS, и 16-ти (или 32-х) битовое смещение, загружаемое в (E)IP.
· Команда косвенного межсегментного перехода адресует в памяти полный 32-х (или 48-ми) битовый указатель – селектор: смещение. Селектор загружается в регистр CS, а смещение – в регистр (E)IP.
КОМАНДЫ УСЛОВНЫХ ПЕРЕХОДОВ осуществляют передачу управления в зависимости от результатов предыдущих операций. Все команды условных переходов производят передачу управления только в пределах текущего сегмента кода (т.е. содержимое сегментного регистра CS не изменяется), если заданное в команде условие удовлетворяется. Переход реализуется прибавлением находящегося в команде смещения (в дополнительном коде) к содержимому регистра (E)IP. В процессорах 86/286 8-ми битовое смещение обеспечивает диапазон перехода от – 128 до +127 байт. В процессорах 386+ наряду с таким смещением допускается также полное 16-ти или 32-х битовое смещение в дополнительном коде. Этим обеспечивается переход в любую точку текущего сегмента кода.
12. Чем отличаются команды JMP и CALL?
Команда CALL имеет такие же формы (относительную, прямую и косвенную), как и команда JMP; отсутствует только короткая (SHORT) форма. По воздействию на регистры CS и (E)IP команда CALL также соответствует команде JMP, но дополнительно включает в текущий сегмент стека адрес возврата с соответствующей коррекцией указателя стека (E)SP.