Эта глава представляет все команды 80386; они являются
расширением множества команд 8086 и 80286. Эти команды в
сочетании с различными режимами адресации 80386-го.
предоставляют пользователю большую гибкость. Способы
адресации 80386-го описаны в главах 4 и 7.
Все множество команд доступно как в 32-битном, так и в
16-битном режимах работы 80386. Главное различие при работе в
32-битном и 16-битном режимах состоит просто в принятой по
умолчанию длиной операнда и размере адреса, которые
используются в командах. Этот принятый по умолчанию размер,
естественно, совпадает с операционным режимом: он равен 32
бита в 32-битном режиме и 16 битов в 16-битном. Кроме этого
различия каждая команда ведет себя одинаково в любом режиме
работы 80386.
Команды выполняют следующие виды операций:
Перемещение данных Обработка строк
Целочисленной арифметики Десятичная арифметика
Булевские (логические) Управления программой
Вращение, сдвиг и двойной сдвиг Управления системой
Манипуляции с битами Синхронизации данных
сопроцессора
Внутри этой главы некоторые регистры идентифицируются по
имени. Дополнительно используются следующие обозначения:
genreg = любой общий регистр: EAX, EBX, ECX, EDX, ESI, EDI,
EBD, ESP(AX, BX, CX, DX, SI, DI, BP, SP - в 16-битном режиме.
segreg = любой сегментный регистр - CS, SS, DS, ES, FS, GS
d = смещение, d8 - смещение на 8 бит
= исполнительный адрес
= метка программы ассемблера
# = непосредственные данные; целое - литерал
stack = вершина стека, на который указывает SS:ESP
full ptr = полный виртуальный адрес (селектор
сегмента: смещение)
C = бит переноса в регистре EFLAG; EFLAG бит 0
S = бит знака в регистре EFLAG; EFLAG бит 7
Z = бит нуля в регистре EFLAG; EFLAG бит 6
~ = логическая обратная величина
y = логическое И
x = логическое ИЛИ
s = логическое исключающее ИЛИ
Команды перемещения данных позволяют перемещать операнды типа
BYTE, WORD, DWORD из памяти в регистр, из регистра в память и
из регистра в рагистр. Команды PUSH, PUSHA, POP и POPA
допускают операции со стеком, если регистр ESP неявно
используется в качестве указателя стека. Значение этого
регистра уменьшается перед каждой командой PUSH и
увеличивается после каждой команды POP. Команды IN и OUT
выполняют ввод/вывод на периферию при адресации в области
ввода/вывода.
Кроме только что упомянутых команд, команды LCS, LSS, LDS,
LES, LFS, LGS также полезны при операциях с адресами. Они
позволяют загрузить компоненты селектора и смещения полного
виртуального адреса соответственно в сегментный регистр и
общий регистр.
Далее, LEA (загрузка исполнительного адреса) в комбинации
с режимом адресации База+Индекс * Шкала является, вероятно,
наиболее разносторонней командой 80386-го. Не упустите ее
потенциал: она может быть использована для выполнения всех
нижеизложенных функций. Если дополнительно определена
константа, она может быть добавлена к результату, и все это
за одну двухтактную команду.
Пример Синтаксис команды Функция
LEA EAX,[EBX] переместить значение
LEA EAX,[EAX+EBX] прибавить по позиции
LEA EAX,[EBX+ECX] прибавить и переместить результат
LEA EAX,[EAX*4] умножить по позиции(*2, *4, *8)
LEA EAX,[EBX*4] умножить и переместить результат
(*2, *4, *8)
LEA EAX,[EAX+EAX*4] умножить и прибавить по позиции
(*3, *5, *9)
LEA EAX,[EAX+EBX*4] умножить другую величину и сложить
LEA EAX,[EBX+ECX*4] умножить, сложить и переместить
результат
Преобразование к большему размеру операндов достигается
использованием команд MOVZX, MOVSX, CBW, CWDE, CWD и CDQ.
XLAT предоставляет возможность преобразования символов с
помощью трансляционной таблицы и также может быть
использована для перевода цепочки символов из, например,
ASCII в EBCDIC.
Региср EFLAG может быть протолкнут по стеку и вытолкнут из
него при использовании команд PUSHF и POPF. Команды CMC, CLC,
STC, CLD и STD изменяют биты флага переноса и направления
непосредсвенно.
Таблица 3.1 Команды перемещения данных<>
Команда Имя Синтаксис Размер Операция
операнда операнда
Общие для данных и адреса
MOV Переместить 8,16,32 назначение источн.
данные 8,16,32 назначение непоср.
данные
XCHG Обмен 8,16,32 назначение источн.
данными
PUSH Протолкнуть 16,32 стек
данные по 8,16,32 стек
стеку
POP Вытолкнуть 16,32 стек
данные из
стека
PUSHA Протолкнуть 8,16,32 стекўвсе genreg
общ.регистр
по стеку
POPA Вытолкнуть 8,16,32 все genregўстек
общ.регистр
из стека
IN Ввести 8,16,32 EAX (I/O адрес n)
данные с [0-255]
порта [DX] 8,16,32 EAX (I/O адрес DX)
ввода/вывода [0-64K]
OUT Вывести #<байт n> 8,16,32 (I/O адрес n) EAX
данные на [0-255]
порт [DX] 8,16,32 (I/O адрес DX) EAX
ввода/вывода [0-64K]
Дополнительные для адреса
LEA Загрузить genreg, 16,32 genregў
исполнит.
адрес
LDS Загрузить genreg, 32,48 DS:genregўfull ptr
full ptr в
DS:genreg
LES Загрузить genreg, 32,48 ES:genregўfull ptr
full ptr в
ES:genreg
LFS Загрузить genreg, 32,48 ES:genregўfull ptr
full ptr в
ES:genreg
LFS Загрузить genreg, 32,48 FS:genregўfull ptr
full ptr в
FS:genreg
LGS Загрузить genreg, 32,48 GS:genregўfull ptr
full ptr в
GS:genreg
LSS Загрузить genreg, 32,48 SS:genregўfull ptr
full ptr в
SS:genreg
Команды преобразования
MOVZX Переместить genreg, 8,16,32 genregўZeroExt
данные с
расширением нуля
MOVSX Переместить genreg, 8,16,32 genregўSignExt
данные с
расширением знака
CBW Преобразовать 8 AXўSignExt(AL)
байт в слово
CWDE Преобразовать WORD 16 EAXўSignExt(AX)
в расширенное
DWORD
CWD Преобразовать WORD 16 DX:AXўSignExt(AX)
в DWORD
CDQ Преобразовать DWORD 32 EDX:EAXўSignExt(AX)
в QUADWORD
XLAT Перевести байт AL 8 ALў(EBX+ZeroExt(AL))
используя таблицу
перевода
Перемещение и управление регистром EFLAG
PUSHFD Протолкнуть EFLAG 16,32 стекўEFLAG
по стеку
POPFD Вытолкнуть EFLAG 16,32 EFLAGўстек
из стека
LAHF Загрузить 8 AHўEFLAG[7,0]
EFLAG[7,0]
в регистр AH
SAHF Записать 8 EFLAG[7,0]ўAH
регистр AH
в EFLAG[7,0]
CMC Дополнить бит 1 EFLAG[0]ўEFLAG[0]
флага переноса ;перенос
CLC Очистить бит 1 EFLAG[0]ў0 ;перенос
флага переноса
CLD Очистить бит 1 EFLAG[10]ў0 ;направл.
флага направления
STC Установить бит 1 EFLAG[0]ў1 ;перенос
флага переноса
STD Установить бит 1 EFLAG[10]ў1 ;направл.
флага направления
Команды целочисленной арифметики выполняют арифметические
действия над операндами всех размеров с высокой скоростью,
используя четыре функции. Поддерживается знаковая и
беззнаковая арифметика, и при всех операциях, кроме деления,
допускаются операнды непосредственных данных. Все команды
умножения используют алгоритм с ранним выходом для уменьшения
времени исполнения команды пропорционально количеству нулей в
старших разрядах . Команда CMP производит знаковое
сравнение двух операндов, результат которого отражается в
регистре EFLAG; CMP не изменяет сами операнды (см. таблицу
3.2).
Булевские команды AND, OR, XOR, NOT и TEST доступны при любом
размере операндов. Во всех этих командах могут быть
использованы непосредственные данные. Команда TEST
осуществляет побитное логическое сложение операнда с нулем,
результат которого отражается в регистре EFLAG; оператор
остается неизменным (см. таблицу 3.3).
Команды вращения, сдвига и двойного сдвига в 80386 доступны с
любым размером операндов. Вычисление сдвига любого числа (по
модулю 32) выполняется так же быстро, как и однобитная
операция, за счет испольования встроенного в чип модуля
сдвига. Многобитные сдвиги допускаются даже для операндов
памяти. Вращения могут исполняться с использованием флага
переноса (RLC и ROR). Сдвиги могут быть арифметическими (SAL
и SAR); их удобно использовать для умножения или деления на
степени двойки. Сдвиги могут быть также логическими (SHL и
SHR); в них нули сдвигаются с любого конца. Новые для 80386
команды двойного сдвига (SHLD и SHRD) позволяют использовать
два 32-битных операнда в одной и той же операции сдвига. С
помощью этих команд можно построить очень быстрые операции
обрабтки полей битов (такие как вставка и перемещение болка),
при этом могут обрабатываться поля произвольной ширины (см.
таблицу 3.4).
Таблица 3.2
Команды целочисленой арифметики
Команда Имя Синтаксис Размер Операция
операнда операнда
ADD Целочисленное , 8,16,32 назн.ўназн.+источн.
сложение ,# 8,16,32 назн.ўназн.+непоср.
данные
, 8,16,32 назн.ўназн.+источн.
ADC Целочисленное +C
сложение с
флагом пере- ,# 8,16,32 назн.ўназн.+непоср.
носа данные+C
, 8,16,32 назн.ўназн.-источн.
SUB Целочисленное ,# 8,16,32 назн.ўназн.-непоср.
вычитание данные
Целочисленное , 8,16,32 назн.ўназн.-источн.
SBB вычитание с +C
флагом пере- ,# 8,16,32 назн.ўназн.-непоср.
носа данные-C
INC Увеличение на 1 8,16,32 назн.ўназн.+1
DEC Уменьшение на 1 8,16,32 назн.ўназн.-1
Целочисленное , 8,16,32 назн.ўисточн.
CMP [влияет на EFLAG]
сравнение ,# 8,16,32 назн.ўнепоср.данные
[влияет на EFLAG]
Целочисленная 8,16,32 назн.ў0-назн.
NEG смена знака
Умножение 8,16,32 EDX:EAXўEAX*
MUL без знака [двойная точн. без знака]
IMUL Умножение genreg, 8,16,32 genregўgenreg*
со знаком genreg,,#8,16,32 genregў*immed
8,16,32 EDX:EAXўEAX*
Деление без
DIV знака 8,16,32 EDX:EAXўEAX*
Деление со
IDIV знаком 8,16,32 EDX:EAXўEAX*
Таблица 3.3 Булевские (логические) команды
Команда Имя Синтаксис Размер Операция
операнда операнда
AND Булевское И , 8,16,32 назн.ўназн.yисточн.
,# 8,16,32 назн.ўназн.yнепоср.
данные
OR Булевское ИЛИ , 8,16,32 назн.ўназн.xисточн.
,# 8,16,32 назн.ўназн.xнепоср.
данные
XOR Булевское ИЛИ , 8,16,32 назн.ўназн.sисточн.
исключающее ,# 8,16,32 назн.ўназн.sнепоср.
данные
NOT Булевское НЕТ , 8,16,32 назн.ў~источн.
TEST Булевский тест , 8,16,32 назн.y0FFFFFFFh
на 0 [влияет на EFLAG]
Таблица 3.4 Команды вращения, сдвига и двойного сдвига.
Команда Имя Синтаксис Размер Операция
операнда операнда
ROL Вращение ,# 8,16,32
налево ,CL 8,16,32
ROR Вращение ,# 8,16,32
направо ,CL 8,16,32
RCL Вращение налево ,# 8,16,32
через флаг ,CL 8,16,32
переноса
RCR Вращение направо,# 8,16,32
через флаг ,CL 8,16,32
переноса
SHL Логический ,# 8,16,32
сдвиг влево ,CL 8,16,32
SHR Логический ,# 8,16,32
сдвиг вправо ,CL 8,16,32
SAL Арифметический ,# 8,16,32
сдвиг влево ,CL 8,16,32
SAR Арифметический ,# 8,16,32
сдвиг вправо ,CL 8,16,32
SHLD Двойной ,# 8,16,32
сдвиг влево ,CL 8,16,32
SHRD Двойной сдвиг ,# 8,16,32
вправо ,CL 8,16,32
С помощью команд BT, BTS, BTR и BTC может осуществляться
прямая манипуляция битами. Указатель выбранного бита может
задаваться непосредственной константой или значением общего
регистра. Команды сканирования битов, BSF и BSR, находят
позицию первого значимого бита, начиная, соответственно, с
младшего и старшего бита.
80386 непосредственно обрабатывает цепочки в операндах типа
BYTE, WORD и DWORD. Цепочка может быть обработана в любом
направлении, в зависимости от установки бита флага
направления в EFLAG. Цепочки могут перемещаться, сравниваться
и сканироваться для нахождения конкретного значения; они
также могут передаваться в область и из области ввода/вывода.
Когда перед командой стоит индекс повторения, выполняется
несколько итераций основных функций. Для очень быстрой
обработки повторяющиеся команды работают на полной или почти
полной ширине шины. Префикс повторения может быть безусловным
(для окончания проверяется только ECX) или условным
(проверяется флаг условия или окончание по ECX).
Эти команды используют регистры ESI и EDI для ссылки на
цепочки, являющиеся операндами. Перед выполнением команды
регистры должны содержать необходимые значения адресов,
которые автоматически уменьшаются или увеличиваются (после
выполнения) на размер операнда (в байтах). Когда определен
префикс повторения, регистр ECX используется в качестве
счетчика итераций, позволяя выполнять команду до тех пор,
пока в ECX не окажется ноль.
Таблица 3.5 Команды вращения, сдвига и двойного сдвига
Команда Имя Синтаксис Размер Операция
операнда операнда
BT Тест бита ,# 16,32 Cў(<номер бита>назн.)
,genreg 16,32
BTS Тест и уста- ,# 16,32 Cў(<номер бита>назн.)
новка бита ,genreg 16,32 бит назн.ў1
BTR Тест и сброс ,# 16,32 Cў(<номер бита>назн.)
бита ,genreg 16,32 бит назн.ў0
BTC Тест и допо- ,# 16,32 Cў(<номер бита>назн.)
лнение бита ,genreg 16,32 бит назн.ў~бит назн.
BSF Сканирование genreg, 16,32 genregўoffset
бита вперед скан. до значимого бита от младш. бита
BSR Обратное genreg, 16,32 genregўoffset
сканирование
бита скан. до значимого бита от старш. бита
Таблица 3.6 Команды обработки цепочек
Команда Имя Размер Операция
операнда
MOVS Переместить 8,16,32 (ES:EDI)ў(ESI)
цепочку ESIўувел.или уменьш. ESI
данных EDIўувел.или уменьш. EDI
REP MOVS С повторением 8,16,32 while ECX<>0
переместить (ES:EDI)ў(ESI)
цепочку ESIўувел.или уменьш. ESI
данных EDIўувел.или уменьш. EDI
CMPS Сравнить 8,16,32 (ES:EDI)ў(ESI)[устан. флаги]
цепочку ESIўувел.или уменьш. ESI
данных EDIўувел.или уменьш. EDI
REPE CMPS Повторяющееся 8,16,32 while ECX<>0 и усл. FALSE
(находит сравнение (ES:EDI)ў(ESI)[устан. флаги]
первую цепочки данных ESIўувел.или уменьш. ESI
несовп. при совпадении EDIўувел.или уменьш. EDI
порцию данных) ECXўECX-1[повтор команды]
REPNE CMPS Повторяющееся 8,16,32 while ECX<>0 и усл. FALSE
(находит сравнение (ES:EDI)ў(ESI)[устан. флаги]
первую цепочки данных ESIўувел.или уменьш. ESI
совп. при несовпадении EDIўувел.или уменьш. EDI
порцию данных) ECXўECX-1[повтор команды]
SCAS Сканировать 8,16,32 (ESI)ўAL/AX/EAX[устан. флаги]
цепочку ESIўувел.или уменьш. ESI
данных EDIўувел.или уменьш. EDI
REPE SCAS Повторяющееся 8,16,32 while ECX<>0 и усл. FALSE
сканирование (ESI)ўAL/AX/EAX[устан. флаги]
цепочки данных ESIўувел.или уменьш. ESI
до несовп. с EDIўувел.или уменьш. EDI
AL/AX/EAX ECXўECX-1[повтор команды]
REPNE Повторяющееся 8,16,32 while ECX<>0 и усл. FALSE
SCAS сканирование (ESI)ўAL/AX/EAX[устан. флаги]
цепочки данных ESIўувел.или уменьш. ESI
до совп. с EDIўувел.или уменьш. EDI
AL/AX/EAX ECXўECX-1[повтор команды]
LODS Загрузить 8,16,32 AL/AX/EAXў(ESI)
цепочку данных ESIўувел.или уменьш. ESI
в AL/AX/EAX EDIўувел.или уменьш. EDI
REP LODS Повторная загрузка бессмысленна. Не существует
STOS Записать 8,16,32 (ESI)ўAL/AX/EAX
AL/AX/EAX ESIўувел.или уменьш. ESI
в цепочку данных EDIўувел.или уменьш. EDI
REP STOS Повторять 8,16,32 while ECX<>0 do:
запись AL/AX/EAX (ESI)ўAL/AX/EAX
в цепочку данных ESIўувел.или уменьш. ESI
(заполнить EDIўувел.или уменьш. EDI
область памяти) ECXўECX-1[повтор команды]
INS Ввод данные 8,16,32 (EDI)ўпорт,задаваемый в DX
с порта в цепочку EDIўувел.или уменьш. EDI
REP INS Повторяющийся 8,16,32 while ECX<>0 do:
ввод данных (EDI)ўпорт,задаваемый в DX
с порта EDIўувел.или уменьш. EDI
в цепочку ECXўECX-1[повтор команды]
OUTS Вывод данных 8,16,32 порт,задаваемый в DXў(ESI)
из цепочки ESIўувел.или уменьш. ESI
на порт
REP OUTS Повторяющийся 8,16,32 while ECX<>0 do:
вывод данных порт,задаваемый в DXў(ESI)
из цепочки ESIўувел.или уменьш. ESI
на порт ECXўECX-1[повтор команды]
Некоторые команды преобразуют двоичные операнды для
упакованной и неупакованной BCD арифметики. Для неупакованного
сложения, вычитания и умножения команды AAA, AAS и AAM должны
быть использованы после, соответственнно, операций сложения,
вычитания и умножения. При неупакованном делении команда AAD
должна быть использована непосредственно перед операцией
деления. Аппендикс B (Детальное описание команд) дает
подробное описание работы этих BCD команд.
Для упакованного BCD сложения и BCD вычитания за операцией
должна следовать, соответственно, команда DAA или DAS. Детали
можно посмотреть также в Аппендиксе B. Обратите внимание, что
размер операндов этих команд приспособлен к 16-битным
операциям, поэтому для 32-битных операций на 80386 должны быть
проведены аналогичные преобразования с использованием общих
команд.
Таблица 3.7. Команды BCD арифметики.
Команда Имя Размер Операция
операнда
AAA ASCII выравнивание 16 Выравнивание AL,если необходимо
после сложения Уменьшение AH,если необходимо
AAS ASCII выравнивание 16 Выравнивание AL,если необходимо
после вычитания Уменьшение AH,если необходимо
AAM ASCII выравнивание 16 AHўAL/10
после умножения ALўAL MOD 10
AAD ASCII выравнивание 16 ALў(AH*10)+AL
перед деление ALў0
DAA Десятичное BCD 8 если AF=1,то выравнять нижний
выравнивание после полубайт регистра AL
сложения если CF=1,то выравнять верхний
полубайт регистра AL
DAS Десятичное BCD 8 если AF=1,то выравнять нижний
выравнивание после полубайт регистра AL
вычитания если CF=1,то выравнять верхний
полубайт регистра AL
Команды условного и безусловного перехода при желании
позволяют програмные переходы. Команда установить байт условно,
SCC, позволяет подпрограммам эффективно возвращать логическую
информацию о состоянии. Подпрограммы и программы прерываний
могут быть вызваны, соответственно, командами CALL и INT n.
Команды ENTER и LEAVE дают удобную возможность создавать и
удалять кадры стека и поддерживают концепцию лексического
вложения, как она применяется при вложении процедур в языках
высокого уровня, таких как C.
Таблица 3.8 Команды управления программой.
Команда Имя Синтакс. Размер Операция
операнда операнда
Условные
JCC Условный 8,16,32 если условие истинно, то
переход EIPўEIP+d
внутри сегмента
SCC Установить 8,16,32 если условие истинно, то
байт условно ў1, иначе ў0
JECXZ Переход по 8 если ECX=0, то
условию EIPўEIP+d
ECX=0
LOOP Перейти и 8 если ECX<>0, то
уменьшить ECX EIPўEIP+d
LOOPE Перейти по 8 ECXўECX-1
условию если ECX<>0 и Z=1, то
равенства и EIPўEIP+d
уменьшить ECX
LOOPNE Перейти по 8 ECXўECX-1
уловию если ECX<>0 и Z=0, то
неравенства EIPўEIP+d
и уменьшить ECX
Безусловные
JMP Безусловный 8,16,32 EIPўEIP+d
переход 48 EIPўfull ptr[31,0]
(поле смещения)
CSўfull ptr[47,32]
(поле селектора)
() 8,16,32 EIPў()
() 48 EIPў()
(поле смещения full ptr)
CSў()
(поле селектора full ptr)
8,16,32 SPўSP-4;(SP)ўEIP;EIPўEIP+d
CALL Вызов под- 48 SPўSP-4;(SP)ўCS;
программы SPўSP-4;(SP)ўEIP;
(или задания)
EIPўfull ptr[31,0]
(поле смещения)
CSўfull ptr[47,32]
(поле селектора)
() 8,16,32 SPўSP-4;(SP)ўEIP;
EIPў()
() 48 SPўSP-4;(SP)ўCS;
SPўSP-4;(SP)ўEIP;
EIPў()
(поле смещения full ptr)
CSў()
(поле селектора full ptr)
INT n Команда 8 SPўSP-4;(SP)ўCS;
прерывания SPўSP-4;(SP)ўEIP;
EIPў()
(поле смещения full ptr)
CSў()
(поле селектора full ptr)
ENTER Создать кадр #, 8,16 Создать кадр стека c
стека для # байтами динамической памяти
параметров и указателями стека,
процедуры скопированными из предыдуще-
го кадра стека
LEAVE Выход в процедуру Освобождает область стека, испо-
высокого уровня льзованную процедурой для своих
локальных переменных (совершает
действия обратные команде ENTER)
Возвраты
RET Возврат IPў(SP);SPўSP+4;(внутри сегмента)
подпрограммы IPў(SP);SPўSP+4;
CSў(SP);SPўSP+4;(между сегм.)
# 16 IPў(SP)+immed.data;
SPўSP+4;(внутри сегмента)
IPў(SP)+immed.data;SPўSP+4;
IRET Возвращение CSў(SP);SPўSP+4;(между сегм.)
прерывания IPў(SP);SPўSP+4;
(или задания) CSў(SP);SPўSP+4;
EFLAGў(SP);SPўSP+4;
Группа машинных команд, часто используемых программистами,
контролирует системные аттрибуты. Некоторые команды позволяют
запомнить и загрузить регистры управления, отладки и тестовые
регистры. Другие проверяют аттрибуты защиты и правильности
сообщения, используя биты флага нуля (ZF).
Таблица 3.9. Команды управления системой
Команда Имя Синтакс. Размер Операция
операнда операнда
MOV Поместить CRn, 32 CRnў
данные в DRn, 32 DRnў
системный TRn, 32 TRnў
регистр
MOV Записать ,CRn 32 ўCRn
данные из ,DRn 32 ўDRn
системного ,TRn 32 ўTRn
регистра
LMSW Загрузить 16 CRO[15..0]ў
слово
состояния
машины
SMSW Запомнить 16 ўCRO[15..0]
слово
состояния
машины
LIDT Загрузить 48 IDTў
таблицу
регистров
дескриптора
прерываний
LGDT Загрузить 48 GDTў
таблицу
регистров
глобального
дескриптора
LLDT Загрузить 16 LDTў
таблицу
регистров
локального
дескриптора
LTR Загрузить 16 TRў
регистр
задания
LIDT Загрузить 16 IDTў
таблицу
регистров
дескриптора
прерываний
SIDT Запомнить 48 ўIDT
таблицу
регистров
дескриптора
прерываний
SGDT Запомнить 48 ўGDT
таблицу
регистров
глобального
дескриптора
SLDT Запомнить 16 ўLDT
таблицу
регистров
локального
дескриптора
STR Запомнить 16 ўTR
регистр
задания
Проверка аттрибутов защиты
LAR Загрузить genreg, 16,32 genregўправа доступа;
права если верны,то Zў1,иначе
доступа Zў0
LSL Загрузить genreg, 16,32 genregўграница сегмента;
границу если верна,то Zў1,иначе
сегмента Zў0
VERR Проверить 16 если читаем, то Zў1,
сегмент иначе Zў0
на чтение
VERR Проверить 16 если запис., то Zў1,
сегмент иначе Zў0
на запись
ARPL Выравнять , 16 выравнять, чтобы RPL в EA
поле RPL genreg был не меньше, чем RPL в
селектора genreg
Управление машиной
HALT Остановиться Стоять, пока не будет получено
до прерывания прерывание
Команда WAIT позволяет синхронизировать данные с математическим
сопроцессором 80287 и 80387. В то время, как данные
пересылаются между сопроцессором и памятью, команда WAIT
вызывает ожидание 80386-ым завершения пересылки перед
выполнением следующей команды. Синхронизация данных,
гарантируемая командой WAIT, необходима только когда и 80386 и
математический сопроцессор работают с одним операндом в
памяти.
Таблица 3.10 Команда синхронизации сопроцессора
WAIT Ждать, пока сопроцессор ждет, пока сигнал BUSY(занят)
не освободится не станет неактивным
Префиксы команд
Перед командами 80386 могут быть помещены различные префиксные
байты. Каждый префиксный байт, если присутствует, меняет
работу команды, которая непосредственно следует за ним. Ниже
приведены пять типов префиксов:
Размер операнда меняет размер операнда по сравнению с
размером по умолчанию
Размер адреса меняет размер адреса по сравнению с
размером по умолчанию
Смена сегмента меняет выбор сегмента по сравнению с
выбором по умолчанию
Запереть шину активизирует сигнал шины LOCK#
(LOCK) (по умолчанию "не активен")
Повторить повторить команду обработки цепочек
согласно числу итераций в регистре ECX
Каждый префикс, показанный на рис. 3.1, имеет единственную
цель. Префикс размера операнда и префикс размера адреса влияют
на размер операнда и размер адреса, как было об`яснено в главе
2. Префикс смены сегмента изменяет выбор сегмента по
умолчанию, как показано в таблице 2.6. Для выбора любого
текущего сегмента вместо сегмента по умолчанию префикс смены
сегмента доступен для каждого сегментного регистра:CS, SS, DS,
ES, FS и GS, как показывает рис. 3.1. Префикс LOCK может
активизировать выходной сигнал 80386, который сообщает другим
процессорам (если таковые имеются), что шина заперта и не
должна прерываться. И наконец, префикс повторения позволяет
выполнить итерации команд обработки цепочек, как было описано
ранее.
Часто одной команде необходимо предпослать несколько
префиксов. Например, для константы может использоваться и
префикс смены сегмента и префикс размера операнда. Порядок
префиксов различных типов не имеет значения. Однако, если
несколько префиксов одного типа (например, несколько префиксов
смены сегмента) предшествуют одной команде, выполняется только
последний. Команды длиной 16 байтов и более (возможные только
при избытке префиксов) являются иллегальными.
Префикс LOCK может предшествовать только некоторым
командам, а именно тем, которые производят обмен данных в
регистрах с памятью и некоторым из тех, которые работают с
операндами назначения памяти. Конкретно, формы команд,
допускающих префикс LOCK, таковы:
XCHG ,genreg ;Обмен памяти с регистром (80286 и
;80386 автоматически запирают эту
;команду)
XCHG genreg, ;обмен регистра с памятью (80286 и
;80386 автоматически запирают эту
;команду)
ADD ,genreg ;Сложить с операндом памяти
ADD ,genreg ;Сложить, используя флаг переноса
SUB ,genreg ;Вычесть из операнда памяти
SBB ,genreg ;Вычесть, используя флаг переноса
NEG ;Произвести отрицание операнда памяти
OR ,genreg ;ИЛИ с операндом памяти
AND ,genreg ;И с операндом памяти
XOR ,genreg ;Исключающее ИЛИ с операндом памяти
NOT ;Логическое НЕТ с операндом памяти
BTC ;Дополнить битовый операнд в памяти
BTR ;Сбросить битовый операнд в памяти
BTS ;Установить битовый операнд в памяти
Если префикс LOCK помещен перед другой командой (кроме
вышеперечисленных),определяется иллегальная команда (См. главы
6 и 16 за дальнейшей информацией, касающейся нарушений). Из-за
наличия страничной поддержки в 80386, он намного сильнее
ограничивает употребление префикса LOCK, чем 8086 и 80286. Оно
должно быть ограничено, потому что в такой страничной
организации, которую предоставляет 80386, нет возможности
гарантировать выполнение, например, успешного LOCK в
повторяющейся команде обработки цепочек. Операционная система
может быть вынуждена вмешаться для обслуживания ошибки
страницы, тем самым прервав предположительно "запертую"
команду.
Однако существует и выигрышный аспект в ограничении
употребления префикса LOCK, так как теперь это употребление
может контролироваться. Для 80386 префикс LOCK доступен на
всех приоритетных уровнях, в то время как для 80286 он
доступен только на уровне высшего приоритета. Это, конечно,
значит, что прикладные программы 80386 могут при желании
использовать префикс LOCK. В качестве типичного использования
можно привести "запертые" команды ADD и SUB, полезные для
вычисления переменных, являющихся семафорами.
Форматы команд должны быть как можно более компактными и
эффективными; для 80386 самая короткая команда имеет длину
один байт. К этому байту может быть добавлена информация о
коде команды и об адресах. Все команды имеют минимум один байт
и максимум пятнадцать байтов длины (включая префиксные байты).
В общем случае, команда 80386 (см. рис. 3.2) состоит из байтов
префиксов (по выбору), байтов кода операции (до двух байтов),
байтов режима адресации (до двух байтов), байтов смещения (до
четырех байтов), и байтов непосредственных данных (до четырех
байтов).
Если команда содержит неопределенные байты кода операции,
80386 сигнализирует об исключительной ситуации неправильного
кода операции (ситуация 6). Если команда становится длиннее 15
байтов за счет избытка префиксов, сигнализируется ситуация
общей защиты (ситуация 13). Смотрите главы 6 и 16 за более
широким охватом исключительных ситуаций процессора.
Содержание
Вперед