Система команд процессоров IntelНиже приводится алфавитный перечень команд процессоров Intel с кратким описанием действия каждой команды и примерами ее использования. включить директиву ассемблера .386 (можно также использовать директивы .486 или .586), а сегменту команд (и во многих случаях сегменту данных) придать описатель use 16:
Команда ааа используется вслед за операцией сложения add в регистре AL двух неупакованных двоично-десятичных (BCD) чисел, если в АХ находится двухразрядное неупакованное двоично-десятичное число. Команда не имеет параметров. Она преобразует результат сложения в неупакованное двоично-десятичное число, младший десятичный разряд которого находится в AL. Если результат превышает 9, выполняется инкремент содержимого регистра АН. Команда воздействует на флаги AF и CF. Пример
add AL,09h ;Неупакованное BCD 9, AX=060Eh ааа ;AX=0704h, неупакованное BCD 74 AAD ASCII-коррекция регистра АХ перед делением
Пример
AAM ASCII-коррекция регистра АХ после умножения
Пример
AAS ASCII-коррекция регистра AL после вычитания
Команда adc осуществляет сложение первого и второго операндов, прибаатяя к результату значение флага переноса CF. Исходное значение первого операнда (приемника) теряется, замещаясь результатом сложения. Второй операнд не изменяется. В качестве первого операнда команды adc можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команда adc (совместно с командой add) обычно используется для сложения 32-разрядных чисел. Команда воздействует на флаги OF, SF, ZF, AF, PF и CF. Пример 1
Пример 2
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Команда adc с 32-разрядными операндами может использоваться для сложения 64-разрядных целых чисел.
ADD Целочисленное сложение
Пример 1
Пример 2
Пример 3
Пример 4
Пример 5
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример
Пример 1 Пример 2 Пример
386+ BOUND
386+ BSF Прямое сканирование битов Команда bsf сканирует слово или двойное слово в поисках бита, равного 1. Сканирование выполняется от младшего бита (0) к старшему. Если в слове не найдено установленных битов, то устанавливается флаг ZF. Если установленные биты есть, то номер первого установленного бита заносится в указанный в команде регистр. Номером бита считается его позиция в слове, отсчитываемая от бита 0. В качестве первого операнда команды bsf следует указывать регистр, куда будет помещен результат сканирования, в качестве второго - регистр или ячейку памяти со сканируемым словом. В команде bsf допустимо использование как 16-битовых, так и 32-битовых операндов (но и первый, и второй операнды должны быть одного типа). Пример 1
Пример 2
Пример 3
Пример 4
386+ BSR Обратное сканирование битов
Пример 1
Пример 2
Пример 3
486+ BSWAP Обмен байтов
Пример
386+ ВТ Проверка бита
Пример 1
Пример 2
Пример 3
Пример 4
386+ ВТС Проверка и инверсия бита
Пример 1
Пример 2
Пример 3
Пример 4
Команда btr проверяет определенный бит в слове, заданном первым операндом, копирует его значение в флаг CF и сбрасывает. Номер бита выступает в качестве второго операнда. Первым операндом команды btr может служить регистр или ячейка памяти, вторым - регистр или непосредственное значение. В команде допустимо использование как 16-битовых, так и 32-битовых операндов, но и первый, и второй операнды должны быть одного типа (за исключением случая, когда второй операнд - константа). Пример 1
Пример 2
Пример 3
Пример 4
386+ BTS Проверка и установка бита
Пример 3
Пример 4
CALL Вызов подпрограммы
far ptr - прямой дальний вызов; word ptr - косвенный ближний вызов; dword ptr - косвенный дальний вызов.
Примеры прямого ближнего вызова
Косвенные ближние вызовы Пример 1
Пример 2
Пример 3
Пример 4
Пример прямого дальнего вызова
Косвенные дальние вызовы Пример 1
Пример 2
Пример 3
Допустимо использование дополнительных режимов адресации 32-разрядных процессоров. В 32-разрядных приложениях допустимо использование 32-битовых операндов. В защищенном режиме роль сегментного адреса выполняет селектор. Примеры
CBW Преобразование байта в слово
Пример 1
Пример 2
386+ CDQ Преобразование двойного слова в четверное
Пример 1
Пример 2
Команда clc сбрасывает флаг переноса CF в регистре флагов. Команда не имеет параметров и не воздействует на остальные флаги процессора. Пример
CLD Сброс флага направления
Пример
CL1 Сброс флага прерываний
Пример
386Р+ CLTS Сброс флага переключения задачи в управляющем регистре 0
CMC Инвертирование флага переноса
Пример
Сами операнды не изменяются. Таким образом, если команду сравнения записать в общем виде
В качестве первого операнда команды сmр можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно, как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Обычно вслед за командой сmр стоит одна из команд условных переходов, анализирующих состояние флагов процесс Пример 1
Пример 2
Пример 3
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример
CMPS Сравнение строк CMPSB Сравнение строк по байтам CMPSW Сравнение строк по словам
Пример 1
Пример 2
В примере 2 имеется пара одинаковых элементов (*) в позиции 8 от начата строк. Поэтому команда jne выполнена не будет. После завершения сравнения строк управление будет передано на метку found. Содержимое регистров в этой точке: СХ=2 (так как не выполнено сравнение двух последних пар символов), SI = <смещение strl> + 9, DI = <смешенис strl> + 9 (выполнено сравнение 9 пар символов). Пример 3
386+ CMPSD Сравнение строк по двойным словам
Пример
В приведенном примере в строках (фактически это целочисленные массивы) различаются последние элементы, и команды jc выполнена не будет. Команда cmpxchg выполняет в одной операции сравнение и обмен операндов. Команда требует два параметра и неявным образом использует третий операнд - регистр ЕАХ. Первый операнд (приемник) должен находиться в 16- или 32-битовой ячейке памяти, второй операнд (источник) - в регистре общего назначения такого же размера. Команда выполняет сравнение операнда-приемника с содержимым неявного операнда - регистра ЕАХ. Если сравниваемые значения совпадают, операнд-приемник замещается операндом-источником (т.е. содержимое регистра записывается в память). Если сравниваемые значения не совпадают, содержимое памяти (приемник) поступает в регистр ЕАХ (рис. П1). Команда воздействует на флаги OF, SF, ZF, AF, PF и CF.
Рис.П1. Действие команды cmpxchg Пример 1
Пример 2
Pentium+ CMPXCHG8B Сравнение и обмен 8 байтов
Рис. П2. Действие команды cmpxchg8b
Пример 2
При работе с многобайтовыми данными не следует забывать о том, что в памяти байты любых данных всегда выстраиваются в порядке их номеров, т.е. от младшим к все более старшим, в то время как при изображении чисел мы применяем обратный порядок - сначала пишем старшие разряды числа, затем младшие. В то же время символьные строки мы изображаем так же, как они располагаются в памяти - для нас естественно считать, что по мере движения по строке вправо номер символа возрастает. Пример 3
Пример 4
Pentium+ CPUID Идентификация процессора
Пример
CWD Преобразование слова в двойное слово
Пример 1
Пример 2
386+ CWDE Преобразование слова в двойное слово с расширением
Пример
Команда daa корректирует результат сложения в регистре AL двух упакованных двоично-десятичных (BCD) чисел (по одной цифре в каждом полубайте), чтобы получить пару правильных упакованных двоично-десятичных цифр. Команда используется вслед за операцией сложения упакованных двоично-десятичных чисел. Если результат сложения превышает 99, возникает перенос и устанавливается флаг CF. Команда воздействует на флаги SF, ZF, AF, PF и CF. Пример 1
Пример 2
DAS Десятичная коррекция в регистре AL после вычитания
Пример 1
Пример 2
DEC Декремент (уменьшение на 1)
Пример 1
Пример 2
Пример 3
Пример 4
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример
DIV Деление целых чисел без знака
Пример 1
Пример 2
Пример З
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. При этом, если делитель представляет 32-битовую величину, то возможен только один вариант команды деления, когда делимое находится в парс регистров EDX:EAX. В этом случае частное будет помещено в регистр ЕАХ, остаток - в EDX. Пример
386+ ENTER Создание стекового кадра для параметров процедуры
Подпрограмма имеет возможность обращаться к своим локальным переменным по адресам ESP-4 и ESP-8 (для случая резервирования места под две переменные). Занеся в стек по этим адресам некоторые данные (полученные в качестве параметров вызова через регистры общего назначения или созданные самостоятельно) подпрограмма может затем многократно к ним обращаться, не боясь их затирания в процессе использования стека. Поскольку команда enter настроила указатель стека на область, находящуюся за пределами локальных переменных, программа может использовать команды push для сохранения в стеке временных данных. Пример
Команда hlt прекращает выполнение программы и переводит процессор в состояние останова. Работа процессора возобновляется после операции запуска, а также в случае прихода немаскируемого или разрешенного маскируемого прерываний.
IDIV Деление целых чисел со знаком
Пример 1
Рис.П3. Состояние стека после входа в подпрограмму и выполнения команды enter8,0(на рисунке адреса ячеек уменьшаются в низ) Пример 2
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. При этом, если делитель представляет 32-битовую величину, то возможен только один вариант команды деления, когда делимое находится в парс регистров EDX:EAX. В этом случае частное будет помещено в регистр БАХ, остаток - в EDX. Пример
IMUL Умножение целых чисел со знаком
Пример 1
Пример 2
Пример 3
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Имеются также варианты команды с двумя и тремя операндами.
Пример 1
Пример 2
IN Ввод из порта
Пример 1
Пример 2
Допустимо использование в качестве операнда-приемника расширенного регистра ЕАХ (если адресуемое устройство позволяет прочитать из его порта двойное слово). Пример
INC Инкремент (увеличение на 1)
Пример 1
Пример 2
Пример 3
Пример 4
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример
(что не избавляет от необходимости инициализировать регистры ES:EDI адресом строки). Пример
Команда hit инициирует в процессоре процедуру прерывания, в результате которой управление передается на обработчик прерывания с номером n, который указан в качестве операнда команды int. В стек текущей программы заносится содержимое регистра флагов, сегментного регистра CS и указателя команд IP, после чего в регистры IP и CS передается содержимое двух слов из вектора прерывания с номером n (расположенных по адресам 0:n*4 и 0:n*4+2). Команда сбрасывает флаги IF и TF в 0. Команда iret, которой всегда завершается обработчик прерывания, восстанавливает исходное состояние этих флагов. Пример 1
Пример 2
Пример 3
INTO Прерывание по переполнению
Пример
IRET Возврат из прерывания
386+ IRETD
Jcc Команды условных переходов
Пример 1
Пример 2
Пример 3
Пример 4
Команды условных переходов имеют варианты 16- и 32-разрядной адресации (при тех же мнемонических обозначениях) и могут передавать управление в диапазоне -32768...+32767 байт для сегментов с атрибутом размера 16 и в диапазоне -231...+231-1 байт для сегментов с атрибутом размера 32.
Команда jmp передает управление в указанную точку того же или другого программного сегмента. Адрес возврата не сохраняется. Команда не воздействует на флаги процессора.
Примеры прямого короткого перехода
Примеры прямого ближнего перехода
Примеры косвенных ближних переходов
Пример 2
Пример 3
Пример 4
Примеры прямых дальних переходов
Примеры косвенных дальних переходов Пример 1
Пример 2
Допустимо использование дополнительных режимов адресации 32-разрядных процессоров. Для 32-разрядных приложений допустимо использование 32-битовых операндов. В защищенном режиме вместо сегментного адреса сегмента (при дальних переходах) выступает его селектор.
LAHF Загрузка флагов в регистр АН
Пример 1
Пример 2
386Р+ LAR Загрузка прав доступа
LDS Загрузка указателя с использованием регистра DS
эквивалентна следующей группе команд:
В качестве первого операнда команды Ids указывается регистр общего назначения; в качестве второго - ячейка памяти с двухсловным содержимым. Указатель, содержащийся в этой ячейке, может быть адресом как процедуры, так и поля данных. Команда не воздействует на флаги процессора. Пример 1
Пример 2
Допустимо использование 32-разрядного регистра-приемника и 32-битового смещения в памяти, а также дополнительных режимов адресации 32-разрядных процессоров. В защищенном режиме вместо сегментного адреса сегмента выступает его селектор.
LEA Загрузка исполнительного адреса
эквивалентна команде
но у первой команды больше возможностей описания адреса интересующей нас ячейки. Команда не воздействует на флаги процессора. Пример 1
Пример 2
Пример 3
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Команда leave выполняет действия, противоположные действиям последней команды enter. Она логически уничтожает созданный командой enter стековый кадр со всеми содержащимися в нем локальными переменными и подготавливает стек к выполнению команды irct, завершающей переход в вызывающую процедуру. Команда leave не имеет параметров. Более подробное описание и пример см. в описании команды enter.
LES Загрузка указателя с использованием регистра ES
эквивалентна следующей группе команд:
В качестве первого операнда команды les указывается регистр общего назначения; в качестве второго - ячейка памяти с двухсловным содержимым. Указатель, содержащийся в этой ячейке, может быть адресом как процедуры, так и поля данных. Команда не воздействует на флаги процессора. Пример 1
Пример 2
Пример 3
Допустимо использование 32-разрядного регистра-приемника и 32-битового смещения в памяти, а также дополнительных режимов адресации 32-разрядных процессоров. В защищенном режиме вместо сегментного адреса сегмента выступает его селектор.
LGS Загрузка указателя с использованием регистра FS LSS Загрузка указателя с использованием регистра FS
Команда Igdt загружает регистр таблицы глобальных дескрипторов (GDTR) из 48-битового псевдодескриптора, содержащего 32-битовый базовый адрес и 16-битовую границу таблицы глобальных дескрипторов, находящейся в памяти. В качестве операнда команды Igdt выступает относительный адрес псевдодескриптора.
386Р+ LIDT Загрузка регистра таблицы дескрипторов прерываний
386Р+ LLDT Загрузка регистра таблицы локальных дескрипторов
386Р+ LMSW Загрузка слова состояния машины
Префикс lock, помещенный перед командой, устанавливает сигнал на линии LOCK системной шины и запрещает доступ к шине другим процессорам на время выполнения данной команды. Этот префикс предназначен для использования в многопроцессорных многозадачных системах для обеспечения исключительного доступа к памяти данного процесса (и данного процессора) на время проверки или модификации некоторой ячейки памяти. Типичный пример операций такого рода - работа с семафорами.
Проверка состояния семафора и его модификация (запись в бит семафора 0, т.е. признака "занят") осуществляется в одной команде btr. На время выполнения этой команды шина многопроцессорной системы блокируется префиксом lock, и другой процессор обратиться к тому же семафору не может. Блокировка шины снимается уже после того, как семафор будет переведен в состояние занятости.
Собственно говоря, никакая проверка здесь не выполняется, однако процесс будет освобождать ресурс лишь если он этот ресурс использует, и проверять состояние флага в этой операции нет необходимости. Однако и здесь необходимо запирание шины на время записи в бит семафора 1, чтобы исключить одновременное обращение двух процессов к одной ячейке памяти.
LODS Загрузка операнда из строки LODSB Загрузка байта из строки LODSW Загрузка слова из строки
(что не избавляет от необходимости инициализировать регистры DS:SI адресом строки). В этом формате возможна замена сегмента строки строка:
Пример 1
Пример 2
Команда аналогична командам МП 86 lodb и lodsw, но позволяет загрузить из строки, адресуемой через регистры DS:ESI (DS:SI для 16-разрядных приложений), двойное слово в регистр ЕАХ. Пример
LOOP Циклическое выполнение, пока содержимое СХ не равно нулю
Пример 1
Пример 2
При использовании в качестве счетчика расширенного регистра ЕСХ максимальное число шагов в цикле увеличивается до 232. Для того чтобы в 16-разрядном приложении процессор при выполнении команды loop использовал не 16-разрядный регистр СХ, а 32-разрядный регистр ЕСХ, перед командой loop необходимо указать префикс замены размера адреса 67h. Пример
LOOPE/LOOPZ Циклическое выполнение, пока равно/циклическое выполнение, пока нуль
Пример
При использовании в качестве счетчика расширенного регистра ЕСХ максимальное число шагов в цикле увеличивается до 232. Для того, чтобы в 16-разрядном приложении процессор при выполнении команд loope/loopz использовал не 16-разрядный регистр СХ, а 32-разрядный регистр ЕСХ, перед командами loope/loopz необходимо указать префикс замены размера адреса 67h. Пример
LOOPNE/LOOPNZ Циклическое выполнение, пока не равно/циклическое выполнение, пока не нуль
Пример
При использовании в качестве счетчика расширенного регистра ЕСХ максимальное число шагов в цикле увеличивается до 232. Для того чтобы в 16-разрядном приложении процессор при выполнении команд loopne/loopnz использовал не 16-разрядный регистр СХ, а 32-разрядный регистр ЕСХ, перед командами loopne/loopnz необходимо указать префикс замены размера адреса 67h. Пример
386Р+ LSL Загрузка границы сегмента
Команда Itr загружает регистр задачи TR селектором сегмента состояния задачи TSS из второго операнда, в качестве которого можно использовать 16- или 32-разрядный регистр общего назначения или 16- или 32-битовое поле памяти. Команда используется в защищенном режиме, если программный комплекс выполнен в виде нескольких самостоятельных задач, и переключения между ними осуществляются с использованием включенных в процессор аппаратных средств поддержки многозадачности.
MOV Пересылка данных
Нельзя также непосредственно переслать содержимое одного сегментного регистра в другой. Такого рода операции удобно выполнять с использованием стека:
Примеры
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример 1
Пример 2
386Р+ MOV Пересылка в\из специальных регистров
После каждой операции пересылки регистры SI и DI получают положительное (если флаг DF=0) или отрицательное (если флаг DF=1) приращение. Величина приращения составляет 1 или 2 в зависимости от размера пересылаемых элементов. Вариант команды movs имеет формат:
В этом случае байты или слова из строки строка_2 пересылаются на место строки строка_]. Размер пересылаемых элементов определяется описанием строк (с помощью директив db или dw). Это не избавляет от необходимости инициализировать регистры ES:DI и DS:SI адресами строк строка _1 и строка_2. В этом формате возможна замена сегмента второй строки (источника):
Рассматриваемые команды могут предваряться префиксом повторения rep (повторять СХ раз). После выполнения рассматриваемых команд регистры SI и DI указывают на ячейки памяти, находящиеся за теми (если DF=0) или перед теми (если DF=1) элементами строк, на которых закончились операции пересылки. Если флаг DF сброшен, то пары регистров DS:SI и ES:DI следует инициализировать начальными адресами строк-операндов; строка-источник будет пересылаться от се начала, в порядке возрастания номеров ее байтов. Если флаг DF установлен, то пары регистров DS:SI и ES:DI следует инициализировать конечными адресами строк-операндов; строка-источник будет пересылаться от ее конца, в порядке уменьшения номеров ее байтов. Команды не воздействует на флаги процессора. Пример 1
Пример 2
Пример 3
Пример 4
386+ MOVSD Пересылка двойного слова из строки в строку
Пример 1
386+ MOVSX Пересылка с расширением знака
Пример 1
Пример 2
Пример 3
Пример 4
386+ MOVZX Пересылка с расширением нуля
Пример 1
Пример 2
Пример 3
Пример 4
Команда inul выполняет умножение целого числа без знака, находящегося в регистре AL (в случае умножения на байт) или АХ (в случае умножения на слово), на операнд-источник (целое число без знака). Размер произведения в два раза больше размера сомножителей. Пример 1
Пример 2
Пример 3
Пример 4
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. При этом, если указанный операнд представляет собой 32-байтовую величину, то результат размещается в регистрах EDX:EAX. Пример 1
Пример 2
NEG Изменение знака, дополнение до 2
Пример 1
Пример 2
Пример 3
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример
NOP Холостая команда
NOT Инверсия, дополнение до 1, логическое отрицание
Правила побитовой инверсии:
Пример 1
Пример 2
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример
OR Логическое ВКЛЮЧАЮЩЕЕ ИЛИ
Правила побитового сложения:
Пример 1
Пример 2
Пример 3
Пример 4
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример
OUT Вывод в порт
Пример 1
Пример 2
Допустимо использование в качестве операнда-источника расширенного регистра ЕАХ (если адресуемое устройство позволяет записать в его порт двойное слово). Пример
(что не избавляет от необходимости инициализировать регистры DS:ESI адресом строки). Пример 1
Пример 2
Команда pop выталкивает 16-битовое данное из стека, т.е. пересылает слово из вершины стека (на которую указывает регистр SP) по адресу операнда-приемника. После этого содержимое SP увеличивается на 2, и SP указывает на предыдущее слово стека, которое теперь является его новой вершиной. Выталкивать из стека можно только целые слова (не байты). Программа должна строго следить за тем, чтобы каждой команде проталкивания в стек push отвечала обратная команда выталкивания из стека pop. Если стек используется для временного хранения некоторых данных, то извлекать эти данные из стека следует в порядке, обратном их сохранению. Пример 1
Пример 2
Пример 3
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример
386+ РОРА Восстановление из стека всех регистров
Пример
386+ POPAD Восстановление из стека всех регистров в 32-разрядном режиме
Пример
POPF Восстановление из стека регистра флагов
Пример 1
Пример 2
386+ POPFD Восстановление из стека расширенного регистра флагов
Пример
Команда push уменьшает на 2 содержимое указателя стека SP и заносит на эту новую вершину двухбайтовый операнд-источник (проталкивает в стек новое данное). Проталкивать в стек можно только целые слова (не байты). Программа должна строго следить за тем, чтобы каждой команде проталкивания в стек push отвечала обратная команда выталкивания из стека pop. Если стек используется для временного хранения некоторых данных, то извлекать эти данные из стека следует в порядке, обратном их сохранению.
в неэффективную последовательность операций со стеком, результатом которой будет проталкивание указанного операнда в стек. Команда push не воздействует на флаги процессора. Пример 1
Пример 2
Допустима засылка в стек 32-битовых операндов (регистров и ячеек памяти), а также занесение в стек 8-, 16- и 32-битовых непосредственных значений. Каждое 8-битовое значение занимает в стеке целое слово. Операнды любого допустимого размера могут заноситься з стек вперемежку', если это не вступает в противоречие с операциями по извлечению этих данных из стека. Пример 1
386+ PUSHA Сохранение в стеке всех регистров
Пример
386+ PUSHAD Сохранение в стеке всех регистров в 32-разрядном режиме
Пример
386+ PUSHFD Занесение в стек содержимого расширенного регистра флагов
Пример
RCL Циклический сдвиг влево через бит переноса
сдвиг осуществляется на 1 бит. В младший бит операнда заносится значение флага CF; старший бит операнда загружается в CF. Если команда записана в формате
сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда поступают сначала в CF, а оттуда - в младшие биты операнда (рис. П4).
Рис. П4. Действие команды rcl. В качестве операнда команды rcl можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда воздействует на флаги OF и CF. Пример 1
Пример 2
Пример 3
Пример 4
Допустим сдвиг 32-битовых операндов. Допустимо указание числа битов сдвига как с помощью регистра CL, так и непосредственным значением. Максимальная величина сдвига составляет 31 бит. Пример
Команда rсl осуществляет сдвиг вправо всех битов операнда. Если команда записана в формате
сдвиг осуществляется на 1 бит. В старший бит операнда заносится значение флага CF; младший бит операнда загружается в CF. Если команда записана в формате
сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда поступают сначала в CF, а оттуда - в старшие биты операнда (Рис. П5). Рис. П.5. Действие команды rcl. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда воздействует на флаги OF и CF. Пример 1
Пример 2
Пример 3
Пример 4
Допустим сдвиг 32-битовых операндов. Допустимо указание числа бит сдвига как с помощью регистра CL, так и непосредственным значением. Максимальная величина сдвига составляет 31 бит. Пример
Pentium+P RDMSR Чтение особого регистра модели
REP Повторение REPE Повторение пока равно REPZ Повторение пока нуль REPNE Повторение пока равно REPNZ Повторение пока не равно
Пример 1
Пример 2
Команда rol осуществляет сдвиг влево всех битов операнда. Если команда записана в формате
сдвиг осуществляется на 1 бит. Старший бит операнда загружается в его младший разряд и одновременно заносится в флаг CF (рис. П6). Если команда записана в формате
сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда перемещаются в его младшие разряды. Последний перенесенный бит одновременно заносится в флаг CF.
Рис. П6. Действие команды rol. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда воздействует на флаги OF и CF. Пример 1
Пример 2
Пример 3
Пример 4
Пример
ROR Циклический сдвиг вправо
сдвиг осуществляется на 1 бит. Младший бит операнда записывается в его старший разряд и одновременно поступает в флаг CF (рис.Ш). Если команда записана в формате
сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда перемещаются в его старшие разряды. Последний перенесенный бит одновременно заносится в флаг CF.
Рис. П7. Действие команды ror. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда воздействует на флаги OF и CF. Пример 1
Пример 2
Пример 3
Пример 4
Допустим сдвиг 32-битовых операндов. Допустимо указание числа бит сдвига как с помощью регистра CL, так и непосредственным значением. Максимальная величина сдвига составляет 31 бит. Пример
SAHF Запись содержимого регистра АН в регистр флагов
Пример 1
Пример 2
Пример 3
SAL Арифметический сдвиг влево
сдвиг осуществляется на 1 бит. В младший бит операнда загружается 0. Если команда записана в формате
сдвиг осуществляется на число битов, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда, пройдя через флаг CF, теряются, а младшие заполняются нулями (рис. П8.).
Рис. П8. Действие команды sal. В качестве операнда команды sal можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Пример 1
Пример 2
Пример 3
Допустим сдвиг 32-битовых операндов. Допустимо указание числа бит сдвига как с помощью регистра CL, так и непосредственным значением. Максимальная величина сдвига составляет 31 бит. Пример
SAR Арифметический сдвиг вправо
сдвиг осуществляется на 1 бит. Старший бит операнда сохраняет свое значение. Если команда записана в формате
сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда, пройдя через флаг CF, теряются, а старший бит расширяется вправо (рис. П9).
Рис. П.9. Действие команды sar. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Пример 1
Пример 2
Пример 3
Допустим сдвиг 32-битовых операндов. Допустимо указание числа бит сдвига как с помощью регистра CL, так и непосредственным значением. Максимальная величина сдвига составляет 31 бит. Пример
Команда sbb вычитает второй операнд (источник) из первого (приемника). Результат замещает первый операнд, предыдущее значение которого теряется. Если установлен флаг CF, из результата вычитается еще 1. Таким образом, если команду вычитания записать в общем виде
то ее действие можно условно изобразить следующим образом:
В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команда sbb обычно используется для вычитания 32-разрядных чисел. Команда воздействует на флаги OF, SF, ZF, PF и CF. Пример 1
Пример 2
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример
SCAS Сканирование строки с целью сравнения SCASB Сканирование строки байтов с целью сравнения SCASW Сканирование строки слов с целью сравнения
После каждой операции сравнения регистр DI получает положительное (если флаг DF=0) или отрицательное (если флаг DF=1) приращение. Величина приращения составляет 1 или 2, в зависимости от размера сравниваемых элементов.
(что не избавляет от необходимости инициализировать регистры ES:DI адресом строки строка). Замена сегмента строки невозможна. Пример 1
В примере 1 в строке имеются символы, отличные от искомого (кода пробела), и команда je выполнена не будет. После завершения сканирования управление будет передано на метку gotit. Содержимое регистров в этой точке: СХ=3 (так как не выполнено сканирование 3 символов), DI = <смещение string> + 5 (выполнено сканирование 5 символов). ES:D1 указывают на символ строки, следующий за отличным от пробела (в данном случае символ "Т"). Пример 2
В примере 2 в строке имеется искомый символ ("/"), и команда jne выполнена не будет. После завершения сканирования управление будет передано на метку gotit. Содержимое регистров в этой точке: СХ=3 (так как не выполнено сканирование 3 символов), DI = <смещение string> + 5 (выполнено сканирование 5 символов). ES:DI указывают на символ строки, следующий за найденным знаком "/" (в данном случае символ "Т").
386+ SCASD
Пример
В примере в массиве чисел имеется искомое число 0 (с таким же успехом можно было искать любое другое число, например, 4567890). Команда jne выполнена не будет. После завершения сканирования управление будет передано на метку is0. Содержимое регистров в этой точке: СХ уменьшится на 4 (просмотрено 4 элемента), DI будет увеличено на 10h (4 числа по 4 байт в числе). Команды, обозначаемые (в книгах, не в программах!) SETcc, осуществляют запись в указанный байтовый операнд 1 или 0 в зависимости от одного из 16 условий, определяемых флагами состояния. Если условие ее выполняется, команда записывает в операнд 1; если условие не выполняется - 0.В качестве операнда можно использовать байтовый регистр или 8-битовую ячейку памяти.
Команды, осуществляющие установку по условию "выше - ниже", предназначены для анализа чисел без знака; команды, осуществляющие установку по условию "больше - меньшее", предназначены для анализа чисел со знаком. Пример 1
Пример 2
386Р+ SGDT Сохранение в памяти содержимого регистра таблицы глобальных дескрипторов
SHL Логический сдвиг влево
386+ SHLD Логический сдвиг влево с двойной точностью
Рис. П10. Действие команды shld. В качестве первого операнда op1можно указывать 16- или 32-разрядный регистр общего назначения или 16- или 32-битовую ячейку памяти. Вторым операндом ор2 может служить только 16- или 32-разрядный регистр общего назначения. Третий операнд, характеризующий число битов сдвига, может находиться в регистре CL или быть непосредственным значением. Пример 1
Пример 2
Пример 3
Пример 4
SHR Логический сдвиг вправо
сдвиг осуществляется на 1 бит. В старший бит операнда загружается 0, а младший теряется. Если команда записана в формате
сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда заполняются нулями, а младшие, пройдя через флаг CF, теряются (рис. П11).
Рис. П11. Действие команды shr. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда воздействует на флаги CF, OF, PF, SF и ZF. Пример 1
Пример 2
Пример 3
Допустим сдвиг 32-битовых операндов. Допустимо указание числа бит сдвига как с помощью регистра CL, так и непосредственным значением. Максимальная величина сдвига составляет 31 бит. Пример 1
Пример 2
386+ SHRD Логический сдвиг вправо с двойной точностью
Рис. П12. Действие команды shrd. Третий операнд, характеризующий число битов сдвига, может находиться в регистре CL или быть непосредственным значением. Пример 1
Пример 2
Пример 3
Пример 4
Команда копирует содержимое регистра таблицы дескрипторов прерываний IDTR (линейный базовый адрес таблицы и ее границу) в поле из 6 байт, указанное в качестве операнда.
386Р+ SLDT Сохранение содержимого регистра таблицы локальных дескрипторов
386Р+ SMSW Сохранение слова состояния машины
STC Установка флага переноса
Пример
STD Установка флага направления
Пример
Команда STI устанавливает флаг разрешения прерываний IF в регистре флагов, разрешая все аппаратные прерывания (от таймера, клавиатуры, дисков и т.д.). Команда не имеет параметров и не воздействует на остальные флаги процессора. Пример
STOS Запись в строку данных STOSB Запись байта в строку данных STOSW Запись слова в строку данных
(что не избавляет от необходимости инициализировать регистры ES:DI адресом строки строка). Заменить сегментный регистр ES нельзя. Пример 1
Пример 2
Пример 3
Пример 4
386+ STOSD Запись двойного слова в строку данных
Пример
Команда str копирует содержимое регистра задачи TR (селектор сегмента состояния задачи) в двухбайтовый регистр общего назначения или 16-битовую ячейку памяти, указанные в качестве операнда.
SUB Вычитание целых чисел
то ее действие можно условно изобразить следующим образом:
В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команда воздействует на флаги OF, SF, ZF, AF, PF и CF. Пример 1
Пример 2
Пример 3
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример
TEST Логическое сравнение
Правила побитового умножения:
Пример 1
Пример 2
Пример 3
Пример 4
Пример 5
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример
386Р+ VERR Проверка сегмента на чтение
386Р+ VERW Проверка сегмента на запись
Команда xadd выполняет в одной операции сложение и обмен операндов. Команда требует двух операндов, причем первый операнд должен быть ячейкой памяти, а второй - регистром. После сложения операндов исходное содержимое памяти переносится во второй операнд (регистр), а полученная сумма записывается в память (на место первого слагаемого) (рис. П13). Команда воздействует на флаги OF, SF, ZF, AF, PF и CF.
Рис. П13. Действие команды xadd. Пример
XCHG Обмен данными между операндами
Пример 1
Пример 2
Пример 3
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример
XLAT Табличная трансляция
Пример
386+ XLAT 386+ XLATB
Пример
XOR Логическое ИСКЛЮЧАЮЩЕЕ ИЛИ
Правила побитового ИСКЛЮЧАЮЩЕГО ИЛИ:
Пример 1
Пример 2
Пример 3
Допустимо использование 32-битовьгх операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример
|