Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Система команд






Система команд, выполняемых процессором, представляет собой нечто подобное таблице истинности логических элементов или таблице режимов работы более сложных логических микросхем.

Написание программ для микропроцессорной системы – важнейший и часто наиболее трудоемкий этап разработки такой системы. А для создания эффективных программ необходимо иметь хотя бы самое общее представление о системе команд используемого процессора. Самые компактные и быстрые программы и подпрограммы создаются на языке Ассемблер, использование которого без знания системы команд абсолютно невозможно, ведь язык Ассемблер представляет собой символьную запись цифровых кодов машинного языка, кодов команд процессора. Конечно, для разработки программного обеспечения существуют всевозможные программные средства. Пользоваться ими обычно можно и без знания системы команд процессора. Чаще всего применяются языки программирования высокого уровня, такие как Паскаль и Си. Однако знание системы команд и языка Ассемблер позволяет в несколько раз повысить эффективность некоторых наиболее важных частей программного обеспечения любой микропроцессорной системы – от микроконтроллера до персонального компьютера.

Именно поэтому в данной главе мы рассмотрим основные типы команд, имеющиеся у большинства процессоров, и особенности их применения.

Каждая команда, выбираемая (читаемая) из памяти процессором, определяет алгоритм поведения процессора на ближайшие несколько тактов. Код команды говорит о том, какую операцию предстоит выполнить процессору и с какими операндами (то есть кодами данных), где взять исходную информацию для выполнения команды и куда поместить результат (если необходимо). Код команды может занимать от одного до нескольких байт, причем процессор узнает о том, сколько байт команды ему надо читать, из первого прочитанного им байта или слова. В процессоре код команды расшифровывается и преобразуется в набор микроопераций, выполняемых отдельными узлами процессора. Но разработчику микропроцессорных систем это знание не слишком важно, ему важен только результат выполнения той или иной команды.

Команда указывает процессору действие, которое нужно выполнить и операнды (данные, над которыми выполняется действие.

В описании кода операнды представляют элементы, над которыми выполняются действия при исполнении операции, заданной данной командой.

Команда может иметь один или два операнда, или вообще не иметь операндов (операнды такой команды не указываются явно, но определяются самой командой).

Операнды, указываемые в командах, могут содержаться в регистрах или в памяти, а также непосредственно в команде.

Значение непосредственного операнда (константы) записывается в специальное поле, определяемое форматом команды.

Для прямого обращения к операнду, размещенному в памяти, служит его имя, заданное в команде, описывающей соответствующую переменную или константу. Операнд, размещенный в памяти, можно также

адресовать с помощью регистров, в которые записываются компоненты, используемые для вычисления адреса операнда.

Общая формула для вычисления адреса приведена выше.

В поле операнда команды может быть записан адрес операнда в памяти, который включает перечисленные в формуле компоненты, причем некоторые из них могут быть пропущены, но при адресации операнда нельзя

указать больше компонентов, чем используется в приведенной формуле. Примеры различных способов адресации приведены ниже.

Базовый адрес сегмента, относительно начала которого вычисляется смещение, выбирается из соответствующего сегментного регистра.

В двухоперандных командах операнды могут размещаться в двух регистрах, в регистре и памяти, в памяти и в регистре. Формат команды, когда оба операнда содержатся в памяти, в процессорах Intel отсутствует (для реализации операции над такими данными следует один из операндов предварительно переслать в регистр). В записи двухадресной команды первый операнд всегда является " приемником" (в него помещается результат выполнения операции), а второй операнд – " источником" (он не изменяется после выполнения команды).

Ниже приведен краткий перечень основных команд процессоров Intel. В приведенной таблице использованы следующие обозначения:

r – операнд в регистре,

m – операнд в памяти,

i – непосредственный операнд,

a – полный адрес,

l – полное смещение,

d – смещение относительно текущей команды (в диапазоне от -128 до 127),

Sreg – один из сегментных регистров,

Acc – регистр аккумулятор EAX/AX/AL,

ExtAcc – аккумулятор с расширением (AH: AL, DX: AX, EDX: EAX),

cnt – счетчик, который может быть непосредственным операндом или содержимым регистра CL;

O – флаг переполнения,

D – флаг направления для цепочечных операций,

I – флаг разрешения прерывания,

T – флаг ловушки,

S – флаг знака,

Z – флаг нуля,

A – вспомогательный флаг переноса (для двоично-десятичной арифметики),

P – флаг паритета,

C – флаг переноса;

" +" – команда изменяет соответствующий флаг по результату операции,

" -" – флаг не модифицируется,

"? " – флаг принимает неопределенное значение,

1 – флаг устанавливается,

0 – флаг очищается.

┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┬ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┬ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐

│ Описание команды │ Формат команды│ ODITSZAPC│

├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤

│ Команды пересылок (передач данных) │

│ Пересылка (эквивалент присваивания) │ MOV r/m, r/m/i │ ---------│

│ Обмен содержимого источника/получателя │ XCHG m/r, r/m │ ---------│

│ Выборка байта из таблицы │ XLAT/XLATB │ ---------│

│ Внесение в стек значения │ PUSH r/m/i │ ---------│

│ Внесение в стек содержимого всех 16- и │ PUSHA │ ---------│

│ 32-битных регистров общего назначения │ PUSHAD │ ---------│

│ Извлечение из стека значения операнда │ POP r/m/i │ ---------│

│ Восстановление из стека всех 16- / 32- │ POPA/POPAD │ ---------│

│ битных регистров общего назначения │ │ ---------│

│ Занесение регистра флагов в стек │ PUSHF/PUSHFD │ ---------│

│ Восстановление регистра флагов из стека│ POPF/POPFD │ +++++++++│

│ Загрузка смещения операнда в регистр │ LEA r, m │ ---------│

│ Загрузка сегмента в сегментный регистр │ LSreg r, m │ ---------│

│ Ввод в EAX/AX/AL значения из порта │ IN Aсс, DX/i │ ---------│

│ Вывод значения в порт с данным номером │ OUT DX/i, Acc │ ---------│

│ Загрузка флажков в регистр AH │ LAHF │ ---------│

│ Загрузка содержимого AH в рег. флагов │ SAHF │ ----+++++│

└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘

┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┬ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┬ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐

│ Описание команды │ Формат команды│ ODITSZAPC│

├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤

│ Передача со знаковым расширением │ MOVSX r, r/m │ ---------│

│ Передача с нулевым расширением │ MOVZX r, r/m │ ---------│

│ Установка байта по условию cc │ SETcc r/m │ ---------│

│ (мнемоника условия формируется, как в командах перехода) │

│ Арифметические команды │

│ Сложение целых чисел │ ADD r/m, r/m/i │ +---+++++│

│ Сложение целых чисел с переносом │ ADC r/m, r/m/i │ +---+++++│

│ Увеличение на 1 операнда │ INC r/m │ +---++++-│

│ Вычитание целых чисел │ SUB r/m, r/m/i │ +---+++++│

│ Вычитание целых чисел с заемом │ SBB r/m, r/m/i │ +---+++++│

│ Уменьшение операнда на 1 │ DEC r/m │ +---++++-│

│ Изменение знака операнда │ NEG r/m │ +---+++++│

│ Сравнение операндов │ CMP r/m, r/m/i │ +---+++++│

│ Умножение беззнаковых: │ │ │

│ – Acc (EAX/AX/AL) на операнд r/m │ MUL r/m │ +---???? +│

│ (результат – в ExtAcc) │ │ │

│ Умножение знаковых целых: │ │ │

│ – Acc на операнд команды, результат – │ IMUL r/m │ +---???? +│

│ в EDX и EAX, или в DX и AX, или в AX│ │ │

│ (определяется разрядностью операнда); │ │ │

│ – регистр r на r/m/i, результат – в r; │ IMUL r, r/m/i │ +---???? +│

│ – r/m на i, результат – в r │ IMUL r, r/m, i │ +---???? +│

│ Деление беззнаковых: │ │ │

│ – ExtAcc на r/m, частное – в Acc, ос- │ DIV r/m │? ---????? │

│ таток – в расширении аккумулятора │ │ │

│ Деление знаковых чисел: │ │ │

│ – ExtAcc на r/m, частное – в Acc, ос- │ IDIV r/m │? ---????? │

│ таток – в расширении аккумулятора │ │ │

│ Подготовка деления (знаковое расшир.): │ │ │

│ – преобразование байта AL в слово AX │ CBW │ ---------│

│ – преобразование слова AX в DX: AX │ CWD │ ---------│

│ Команды десятичной арифметики │

│ Десятичная коррекция после сложения │ DAA │? ---+++++│

│ Десятичная коррекция после вычитания │ DAS │? ---+++++│

│ ASCII-коррекция после сложения │ AAA │? ---?? +? +│

│ ASCII-коррекция после вычитания │ AAS │? ---?? +? +│

│ ASCII-коррекция после умножения │ AAM │? ---++? +? │

│ ASCII-коррекция перед делением │ AAD │? ---++? +? │

│ Команды логических операций и сдвиги │

│ Конъюнкция (поразрядная операция И) │ AND r/m, r/m/i │ 0---++? +0│

│ Дизъюнкция (поразрядная операция ИЛИ) │ OR r/m, r/m/i │ 0---++? +0│

│ Исключающее ИЛИ (поразрядная операция) │ XOR r/m, r/m/i │ 0---++? +0│

│ Проверка (И без изменения операндов) │ TEST r/m, r/m/i│ 0---++? +0│

│ Отрицание (поразрядная инверсия) │ NOT r/m │ ---------│

│ Циклические сдвиги-выдвигаемый бит помещается в освобождающийся: │

│ – вправо через перенос (флаг CF) │ RCR r/m, cnt │ +-------+│

│ – влево через перенос (флаг CF) │ RCL r/m, cnt │ +-------+│

│ – обычный вправо │ ROR r/m, cnt │ +-------+│

│ – обычный влево │ ROL r/m, cnt │ +-------+│

└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘

┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┬ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┬ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐

│ Описание команды │ Формат команды│ ODITSZAPC│

├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤

│ Арифметические сдвиги (деление/умножение на 2 в степени cnt): │

│ – вправо (деление на степень двойки) │ SAR r/m, cnt │ +---++? ++│

│ – влево (умножение на степень двойки) │ SAL r/m, cnt │ +---++? ++│

│ Логические сдвиги (в освобождающийся бит помещается 0): │

│ – вправо │ SHR r/m, cnt │ +---++? ++│

│ – влево (эквивалентна SAL) │ SHL r/m, cnt │ +---++? ++│

│ Двойные сдвиги (" объединения" первого и второго операндов): │

│ – вправо │ SHRD r/m, r, cnt│? ---++? ++│

│ – влево │ SHLD r/m, r, cnt│? ---++? ++│

│ Операции с двоичными цепочками(операнд 1-цепочка, операнд 2-бит): │

│ – проверка бита (бит передается в CF) │ BT r/m, r/i │ --------+│

│ – проверка и инвертирование бита │ BTC r/m, r/i │ --------+│

│ – проверка и установка бита │ BTS r/m, r/i │ --------+│

│ – проверка и сброс бита │ BTR r/m, r/i │ --------+│

│ Команды передачи управления │

│ Безусловные переходы: │ │ │

│ – короткий (SHORT) переход │ JMP d │ ---------│

│ – прямой внутрисегментный (NEAR) │ JMP l │ ---------│

│ – косвенный внутрисегментный │ JMP [r]/m │ ---------│

│ – прямой межсегментный переход │ JMP a │ ---------│

│ – косвенный межсегментный │ JMP m │ ---------│

│ Условные переходы Jcc (внутрисегментные) по значениям флажков: │

│ – " выше" / не " ниже или равно" │ JA/JNBE d/l │ ---------│

│ – " выше или равно" / не " ниже" │ JAE/JNB d/l │ ---------│

│ – " ниже" / не " выше или равно" │ JB/JNAE d/l │ ---------│

│ – " ниже или равно" / не " выше" │ JBE/JNA d/l │ ---------│

│ – " есть перенос" │ JC d/l │ ---------│

│ – " равно" / " нуль" │ JE/JZ d/l │ ---------│

│ – " больше" / не " меньше или равно" │ JG/JNLE d/l │ ---------│

│ – " больше или равно" / не " меньше" │ JGE/JNL d/l │ ---------│

│ – " меньше" / не " больше или равно" │ JL/JNGE d/l │ ---------│

│ – " меньше или равно" / не " больше" │ JLE/JNG d/l │ ---------│

│ – " нет переноса" │ JNC d/l │ ---------│

│ – " не равно" / " не нуль" │ JNE/JNZ d/l │ ---------│

│ – " нет переполнения" │ JNO d/l │ ---------│

│ – " нет паритета" / " паритет нечетный" │ JNP/JPO d/l │ ---------│

│ – " нет знака" (результат положительный)│ JNS d/l │ ---------│

│ – " есть переполнение" │ JO d/l │ ---------│

│ – " есть паритет" / " паритет четный" │ JP/JPE d/l │ ---------│

│ – " есть знак" (результат отрицательный)│ JS d/l │ ---------│

│ Переход по значению счетчика (регистра ECX/CX): │ │

│ – переход по нулю в CX │ JCXZ d │ ---------│

│ – переход по нулю в ECX │ JECXZ d │ ---------│

│ Команды управления циклом (ECX/CX содержит счетчик цикла): │

│ – уменьшить значение счетчика на 1, вы-│ LOOP d │ ---------│

│ полнить переход, если получен не нуль │ │ │

│ – уменьшить значение счетчика на 1, вы-│ LOOPE/LOOPZ d │ ---------│

│ полнить переход, если счетчик не равен│ │ │

│ нулю и ZF=1 │ │ │

└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘

┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┬ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┬ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐

│ Описание команды │ Формат команды│ ODITSZAPC│

├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤

│ – уменьшить значение счетчика на 1, вы-│ LOOPNE/LOOPNZd│ ---------│

│ полнить переход, если счетчик не равен│ │ │

│ нулю и ZF=0 │ │ │

│ Команды вызова подпрограммы (переход с возвратом): │ │

│ – прямой внутрисегментный (NEAR) вызов│ CALL l │ ---------│

│ – косвенный внутрисегментный вызов │ CALL [r]/m │ ---------│

│ – прямой межсегментный (FAR) вызов │ CALL a │ ---------│

│ – косвенный межсегментный вызов │ CALL m │ ---------│

│ (адрес возврата для команд вызова подпрограмм помещается в стек)│

│ Возврат из подпрограммы: │ │ │

│ – без изменения стека │ RET/RETN/RETF │ ---------│

│ – с увеличением SP на i после извлече-│ RET i │ ---------│

│ ния из стека адреса возврата │ │ │

│ Прерывание программы │ INT i │ --00-----│

│ Прерывание при переполнении (при OF=1) │ INTO │ --00-----│

│ Возврат из прерывания │ IRET/IRETD │ +++++++++│

│ Команды обработки цепочек (выполнение операции над текущим │

│ элементом цепочки и автоматический переход к следующему): │

│ (источник – цепочка, адресуемая регистрами DS: [ESI/SI], приемник│

│ - цепочка, адресуемая регистрами ES: [EDI/DI]; содержимое индекс-│

│ ных регистров модифицируется в соответствии со значением флажка│

│ направления (автоинкремент при DF=0 и автодекремент при DF=1)) │

│ Передача цепочки │ MOVS m, m │ ---------│

│ Передача байтов │ MOVSB │ ---------│

│ Передача слов │ MOVSW │ ---------│

│ Передача двойных слов │ MOVSD │ ---------│

│ Сравнение элементов цепочки │ CMPS m, m │ +---+++++│

│ Сравнение байтов │ CMPSB │ +---+++++│

│ Сравнение слов │ CMPSW │ +---+++++│

│ Сравнение двойных слов │ CMPSD │ +---+++++│

│ Сканирование элементов цепочки (вычита-│ SCAS m │ +---+++++│

│ ние из Acc элемента цепочки) │ │ │

│ Сканирование байтов │ SCASB │ +---+++++│

│ Сканирование слов │ SCASW │ +---+++++│

│ Сканирование двойных слов │ SCASD │ +---+++++│

│ Загрузка элементов цепочки в Acc │ LODS m │ ---------│

│ Загрузка в аккумулятор байта │ LODSB │ ---------│

│ Загрузка в аккумулятор слова │ LODSW │ ---------│

│ Загрузка в аккумулятор двойного слова │ LODSD │ ---------│

│ Пересылка Acc в элемент цепочки │ STOS m │ ---------│

│ Пересылка аккумулятора в байт цепочки │ STOSB │ ---------│

│ Пересылка аккумулятора в слово │ STOSW │ ---------│

│ Пересылка аккумулятора в двойное слово │ STOSD │ ---------│

│ Ввод из порта (номер в DX) в цепочку │ INS DX, r/m │ ---------│

│ Ввод байта из порта │ INSB │ ---------│

│ Ввод слова из порта │ INSW │ ---------│

│ Ввод двойного слова из порта │ INSD │ ---------│

│ Вывод цепочки в порт (номер порта в DX)│ OUTS DX, r/m │ ---------│

│ Вывод байтов в порт │ OUTSB │ ---------│

└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘

┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┬ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┬ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐

│ Описание команды │ Формат команды│ ODITSZAPC│

├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤

│ Вывод слов в порт │ OUTSW │ ---------│

│ Вывод двойных слов в порт │ OUTSD │ ---------│

│ Префиксы повторения (инициируют циклическое выполнение команд со│

│ счетчиком повторений в регистре ECX/CX): │ │

│ – повторять до конца цепочки (CX< > 0) │ REP │ -----+---│

│ – повторять, если ECX/CX< > 0 и ZF=1 │ REPE/REPZ │ -----+---│

│ – повторять, если ECX/CX< > 0 и ZF=0 │ REPNE/REPNZ │ -----+---│

│ Команды поддержки языков высокого уровня: │

│ Контроль нахождения индекса массива в │ BOUND r, m │ ---------│

│ заданных пределах (r содержит текущий │ │ │

│ индекс, m адресует два слова или двой- │ │ │

│ ных слова – верхнюю и нижнюю границы) │ │ │

│ Вход в процедуру │ ENTER i, i │ ---------│

│ Выход из процедуры │ LEAVE │ ---------│

│ Команды управления процессором: │

│ Флажковые команды: │ │ │

│ – сброс/инвертирование/установка флаж-│ CLC/CMC/STC │ --------+│

│ ка переноса CF │ │ │

│ – сброс/установка флага направления DF│ CLD/STD │ -+-------│

│ – сброс/установка флага прерывания IF │ CLI/STI │ --+------│

│ Останов процессора до сброса или внеш- │ HLT │ ---------│

│ него прерывания │ │ │

│ Пустая команда (код 90h) │ NOP │ ---------│

│ Системные команды: │

│ Загрузка регистра GDTR │ LGDT m │ ---------│

│ Сохранение регистра GDTR │ SGDT m │ ---------│

│ Загрузка регистра IDTR │ LIDT m │ ---------│

│ Сохранение регистра IDTR │ SIDT m │ ---------│

│ Загрузка регистра LDTR │ LLDT r/m │ ---------│

│ Сохранение регистра LDTR │ SLDT r/m │ ---------│

│ Загрузка слова состояния машины (млад- │ LMSW │ ---------│

│ ших 16 бит регистра CR0) │ │ │

│ Выгрузка слова состояния машины (млад- │ SMSW │ ---------│

│ ших 16 бит регистра CR0) │ │ │

│ Проверка сегмента на считывание │ VERR r/m │ -----+---│

│ Проверка сегмента на запись │ VERW r/m │ -----+---│

│ Загрузка прав доступа сегмента │ LAR r, r/m │ -----+---│

│ Загрузка предела сегмента │ LSL r, r/m │ -----+---│

│ Коррекция уровня привилегий │ ARPL r/m, r │ -----+---│

│ Новые команды │

│ Обмен байт │ BSWAP │ ---------│

│ Обмен и сложение │ XADD │ +---+++++│

│ Сравнение и обмен │ CMPXCHG │ +---+++++│

│ │ CMPXCHG8B │ +---+++++│

└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘

При использовании справочной информации, приведенной в таблице, следует помнить, что команды, оба операнда которых находятся в памяти, допустимы только для операций над цепочками (при использовании префикса повторения они выполняют блочную пересылку или сравнение блоков памяти). Кроме того: для двухадресных команд требуется соответствие типов операндов команды, результат операции умножения всегда имеет удвоенную длину, а делимое для операции деления необходимо подготовить с помощью команд знакового расширения. Существуют также ограничения на выполнение пересылок, например: нельзя выполнить пересылку прямо из одного сегментного регистра в другой.

Символ " /" в приведенной таблице разделяет альтернативные варианты записи операций или операндов. Нужный вариант определяется выбором команды и используемых в ней операндов.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.