Часть 2
- 29 -
ГЛАВА 3
Система команд: краткое описание.
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Эта глава представляет все команды 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 также полезны при операциях с адресами. Они
- 30 -
позволяют загрузить компоненты селектора и смещения полного
виртуального адреса соответственно в сегментный регистр и
общий регистр.
Далее, 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
общ.регистр
по стеку
- 31 -
Продолжение таблицы 3.1 Команды перемещения данных
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Команда Имя Синтаксис Размер Операция
операнда операнда
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
POPA Вытолкнуть 8,16,32 все genregчстек
общ.регистр
из стека
IN Ввести #<байт n> 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
данные с
расширением знака
- 32 -
Продолжение таблицы 3.1 Команды перемещения данных
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Команда Имя Синтаксис Размер Операция
операнда операнда
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
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 ;направл.
флага направления
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Команды целочисленной арифметики
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Команды целочисленной арифметики выполняют арифметические
действия над операндами всех размеров с высокой скоростью,
используя четыре функции. Поддерживается знаковая и
беззнаковая арифметика, и при всех операциях, кроме деления,
допускаются операнды непосредственных данных. Все команды
умножения используют алгоритм с ранним выходом для уменьшения
- 33 -
времени исполнения команды пропорционально количеству нулей в
старших разрядах . Команда 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
- 34 -
Продолжение таблицы 3.2
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Команда Имя Синтаксис Размер Операция
операнда операнда
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Целочисленное , 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]
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
- 35 -
Таблица 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).
- 36-
Эти команды используют регистры 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[повтор команды]
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
- 37 -
Продолжение таблицы 3.6 Команды обработки цепочек
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Команда Имя Размер Операция
операнда
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
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[повтор команды]
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
- 38-
Команды десятичной арифметики в двоичном коде (BCD команды)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Некоторые команды преобразуют двоичные операнды для
упакованной и неупакованной 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.
- 39 -
Таблица 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)
- 40 -
Продолжение таблицы 3.8 Команды управления программой.
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Команда Имя Синтакс. Размер Операция
операнда операнда
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
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).
- 41 -
Таблица 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
таблицу
регистров
дескриптора
прерываний
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
- 42 -
Продолжение таблицы 3.9. Команды управления системой
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Команда Имя Синтакс. Размер Операция
операнда операнда
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
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 и
математический сопроцессор работают с одним операндом в
памяти.
- 43 -
Таблица 3.10 Команда синхронизации сопроцессора
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
WAIT Ждать, пока сопроцессор ждет, пока сигнал BUSY(занят)
не освободится не станет неактивным
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Префиксы команд
Перед командами 80386 могут быть помещены различные префиксные
байты. Каждый префиксный байт, если присутствует, меняет
работу команды, которая непосредственно следует за ним. Ниже
приведены пять типов префиксов:
Размер операнда меняет размер операнда по сравнению с
размером по умолчанию
Размер адреса меняет размер адреса по сравнению с
размером по умолчанию
Смена сегмента меняет выбор сегмента по сравнению с
выбором по умолчанию
Запереть шину активизирует сигнал шины LOCK#
(LOCK) (по умолчанию "не активен")
Повторить повторить команду обработки цепочек
согласно числу итераций в регистре ECX
Каждый префикс, показанный на рис. 3.1, имеет единственную
цель. Префикс размера операнда и префикс размера адреса влияют
на размер операнда и размер адреса, как было об`яснено в главе
2. Префикс смены сегмента изменяет выбор сегмента по
умолчанию, как показано в таблице 2.6. Для выбора любого
текущего сегмента вместо сегмента по умолчанию префикс смены
сегмента доступен для каждого сегментного регистра:CS, SS, DS,
ES, FS и GS, как показывает рис. 3.1. Префикс LOCK может
активизировать выходной сигнал 80386, который сообщает другим
процессорам (если таковые имеются), что шина заперта и не
должна прерываться. И наконец, префикс повторения позволяет
выполнить итерации команд обработки цепочек, как было описано
ранее.
7 бит 0 бит
0і1і1і0і0і1і1і0
Префикс размера операнда: 66 шестнадцатеричное
0і1і1і0і0і1і1і1
Префикс размера адреса: 67 шестнадцатеричное
0і0і1і0і1і1і1і0
Префикс смены CS: 2E шестнадцатеричное
0і0і1і1і0і1і1і0
Префикс смены SS: 36 шестнадцатеричное
0і0і1і1і1і1і1і0
Префикс смены DS: 3E шестнадцатеричное
0і0і1і0і0і1і1і0
Префикс смены ES: 26 шестнадцатеричное Рис.3.1. Префиксы команд.
0і1і1і0і0і1і0і0
Префикс смены FS: 64 шестнадцатеричное
0і1і1і0і0і1і0і1
Префикс смены GS: 65 шестнадцатеричное
1і1і1і1і0і0і0і0
Префикс запирания шины: F0 шестнадцатеричное
1і1і1і1і0і0і1і0
Префикс повторения: F2 шестнадцатеричное
1і1і1і1і0і0і1і0
Префикс повторения, если не равно: F2 шестнадцатеричное
1і1і1і1і0і0і1і1
Префикс повторения, если равно: F3 шестнадцатеричное
- 44 -
Часто одной команде необходимо предпослать несколько
префиксов. Например, для константы может использоваться и
префикс смены сегмента и префикс размера операнда. Порядок
префиксов различных типов не имеет значения. Однако, если
несколько префиксов одного типа (например, несколько префиксов
смены сегмента) предшествуют одной команде, выполняется только
последний. Команды длиной 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 самая короткая команда имеет длину
один байт. К этому байту может быть добавлена информация о
коде команды и об адресах. Все команды имеют минимум один байт
и максимум пятнадцать байтов длины (включая префиксные байты).
- 45 -
В общем случае, команда 80386 (см. рис. 3.2) состоит из байтов
префиксов (по выбору), байтов кода операции (до двух байтов),
байтов режима адресации (до двух байтов), байтов смещения (до
четырех байтов), и байтов непосредственных данных (до четырех
байтов).
младшие адреса памяти старшие адреса памяти
код код
іпрефиксі і іmod r/sіs-1-bі і і і і і і і
операции операции
смещение данные
(1,2 или 4 байта)
Рис. 3.2 Общий формат команды 80386.
Если команда содержит неопределенные байты кода операции,
80386 сигнализирует об исключительной ситуации неправильного
кода операции (ситуация 6). Если команда становится длиннее 15
байтов за счет избытка префиксов, сигнализируется ситуация
общей защиты (ситуация 13). Смотрите главы 6 и 16 за более
широким охватом исключительных ситуаций процессора.
ЧАСТЬ II
16-битное программирование: реальный режим 80386
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Благодаря 16-битному реальному режиму в 80386 существующие
для 8086/8088 программы могут идти на 80386 и быстрее, чем это
было возможно ранее. Совместимость реального режима очевидно
притягивает многих пользователей 8086/8088, хотя она
представляет только верхушку айсберга возможностей 80386.
Цель данной части состоит в полном и точном описании
реального режима 80386, включая рассмотрение всех новых черт
80386, касающихся реального режима. Для тщательного
рассмотрения реального режима 80386 в этой части представлены
дополнительные команды, дополнительные префиксы команд,
дополнительные регистры, и даже дополнительные исключительные
ситуации, которые детектируются 80386-ым.
Глава 4
Адресация памяти в 16-битных режимах
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Эта глава об`ясняет адресацию памяти в совместимым с
8086/8088 реальном режиме и в совместным с 8086/8088
виртуальным 8086 режиме. Так как оба режима являются
8086/8088-совместимыми, режимы адресации, доступные при
16-битном программировании, идентичны в обоих режимах.
Единственной разницей между реальным и виртуальном 8086
режимами является доступность постраничной организации в
виртуальном 8086 режиме. Однако, страничная организация обычно
контролируется 32-битной основной программой и является
прозрачной для 16-битных программ.
Эта глава фокусирует внимание на 16-битных режимах
адресации. В этих режимах исполнительный адрес вычисляется как
сумма трех компонентов 16-битного адреса: базы, смещения и
индекса. Поэтому исполнительный адрес также является 16-битной
величиной. Общий процесс 16-битной адресации показан на
рисунке 4.1, а 16-битной адресации, использующей постраничную
организацию - на рис. 4.2.
- 46 -
Исполнительный адрес рассматривается как смещение от базы
текущего сегмента памяти. Поэтому, второй шаг при любом
16-битном режиме адресации состоит в прибавлении базы сегмента
к исполнительному адресу. Адрес базы сегмента - это значение
селектора, умноженное на 16, или, как показывают рис. 4.1 и
4.2, значение селектора, сдвинутое на четыре позиции влево.
Таким образом, адрес базы сегмента является 20-битной
величиной, и линейный адрес также становится 20-битной
величиной.
16-битные режимы работы обеспечивают пространство линейных
адресов в 2 в 20 степени байт, другими словами, один мегабайт
памяти. Это прямой результат 16-битных режимов адресации,
которые, благодаря 4-битному сдвигу адреса базы сегмента,
генерирует 20-битный линейный адрес.
Вожможны различные комбинации компонентов 16-битного
адреса, использующие подмножества доступных компонент. Простые
режимы используют только один компонент, а более сложные
используют больше.
Большинство режимов адресации является регистровыми
режимами непрямой адресации. Они применимы к адресации данных
и программ. 80386 представляет также режимы непрямой адресации
памяти, они, однако, применимы только к адресации программ. На
последующих страницах описаны и проиллюстрированы все
16-битные режимы адресации. Обратите внимание, что эти примеры
тщательно демонстрируют модуль выполняемого сложения, чтобы
показать, поддерживается или теряется перенос сложения.
31 15 0
Ъ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї
Базовый регистр і і База і
А Д Д Д Д Д Д ДБДДВДДДДДДДДДДДЩ
і
31 15 0 і
Ъ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї і
і ірасширение і щ Сложение по
Смещение і і знака іДДДц+ 16
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і модулю 2
і
31 15 0 і
Ъ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї і
Индексный і і і щ Сложение по
регистр і і Индекс іДДДц+ 16
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і модулю 2
і
і ИСПОЛНИТЕЛЬНЫЙ
і АДРЕС
Д Д Д Д Д і Д Д
31 14 4 3 0 і
Адрес базыЪ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї і
і Селектор і і щ Сложение по
сегмента і00000000000000 сегмента і0000іДДДц+ 32
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і модулю 2
і
і ЛИНЕЙНЫЙ
і АДРЕС -
і
і ФИЗИЧЕСКИЙ
і АДРЕС
31 щ 0
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
Физический адрес: і Физический адрес і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Рис. 4.1 Вычисление 16-битного адреса (Реальный режим, без
страничной организации).
- 47 -
Введение в страничную организацию памяти.
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
В виртуальном 8086 режиме 80386 предлагает встроенную
поддержку виртуальной памяти посредством страничной
организации. Страничная организация, если она позволена, - это
процесс перевода, выполняемый над линейным адресом перед
доступом к памяти. Шестнадцатибитная адресация, включая
страничную организацию, проиллюстрирована на рис 4.2 и
применена к виртуальному 8086 режиму. В реальном режиме
страничная организация не допускается.
Страничная трансляция преобразует 32-битный линейный адрес
- расширенную форму 20-битного линейного адреса. Как
показывает рис. 4.2, трансляция страницы приводит к замене
верхних 20 битов исполнительного адреса на другую 20-битную
величину. Смещение является функцией оригинальной 20-битной
величины, использующей таблицу страниц - резидент в памяти.
Этот раздел рассматривает страничную организацию, так как она
связана со всем процессом перевода адреса. Но это просто
введение в страничную организацию, которая будет описана в
главе 3. Оставшаяся часть этой главы описывает формирование
16-битного адреса.
31 15 0
Ъ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї
Базовый регистр і і База і
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ
31 15 0 і
Ъ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї і
і ірасширение і щ Сложение по
Смещение і і знака іДДДц+ 16
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і модулю 2
31 15 0 і
Ъ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї і
Индексный і і і щ Сложение по
регистр і і Индекс іДДДц+ 16
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і модулю 2
і
і ИСПОЛНИТЕЛЬНЫЙ
і АДРЕС
Д Д Д Д Д і Д Д
31 14 4 3 0 і
Адрес базыЪ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї і
і Селектор і і щ Сложение по
сегмента і00000000000000 сегмента і0000іДДДц+ 32
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і модулю 2
і
ЪДДДДДДДДДДґ ЛИНЕЙНЫЙ
і і АДРЕС
31 щ 12 1і1 0
ЪДДДДДДДДДДДДДДДДДіД Д Д Д Д Дї
іТрансляция страі і СМЕЩЕНИЕ і
Трансляция страницы: іницы биты 31-12і і СТРАНИЦЫ і
АДДДДДДДДДДДДДДДДДіД Д Д Д Д ДЩ
і і
і і ФИЗИЧЕСКИЙ
і і АДРЕС
31 щ щ 0
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
Физический адрес: і Физический адрес і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Рис. 4.2 Вычисление 16-битного адреса (Виртуальный 8086
режим, со страничной организацией).
- 48 -
Прямые регистровые режимы
ДДДДДДДДДДДДДДДДДДДДДДДДД
Прямые регистровые режимы требуют, чтобы операнд находился в
одном из восьми общих регистров, одном из шести об`ектных
регистров или в одном из системных регистров.
Прямой режим с общим регистром
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Операнд находится в общем регистре, специфицированном в поле
R/M. Использованный размер регистра может быть 8,16 и 32 бита,
в зависимости от размера операнда данных команды.
Вычисление: EA=genreg
Синтаксис Ассемблера: genreg
MOD: 00
Регистр: reg, r/m
31 15 7 0
Ъ Д Д Д Д Д Д ДВДДДДДДДВДДДДДДї
і і і
Общий регистр: genreg ДДДДДДДДДЕДДДДДДДДДДДДДці Операнд і
і і і
А Д Д Д Д Д Д ДБДДДДДДДБДДДДДДЩ
Прямой режим с сегментным режимом
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Операнд находится в сегментном регистре,специфицированном в
поле регистра. Обратите внимание, что этот режим адресации не
использует байт MOD R/M. Вместо этого он использует поле SREG
команды, из которого загружаются или в который запоминаются
сегментные регистры.
Вычисление: EA=segreg
Синтаксис Ассемблера: segreg
Регистр: SREG
15 0
ЪДДДДДДДДДДДДДДї
і і
Сегментный регистр: segreg ДДДДДДДДДДДДДДДДДДці Операнд і
і і
АДДДДДДДДДДДДДДЩ
Непосредственные режимы
ДДДДДДДДДДДДДДДДДДДДДДД
Непосредственная адресация подразумевает, что операнд
содержится в самой команде. Режим непосредственной адресации
может специфицировать только операнд источника, но не операнд
назначения. Непосредственный операнд может быть байтом или
словом. Режим непосредственной адресации не определяется
байтом MOD R/M; вместо этого некоторые коды команд неявно
определяют использование непосредственной адресации для
операнда источника. Те же команды могут однако включать байт
MOD R/M для определения операнда назначения.
Вычисление: EA=#
Синтаксис Ассемблера: data
Opcode: Некоторые коды операций неявно
определяют использование непосредственных данных
- 49 -
31 15 7 0
Ъ Д Д Д Д Д Д ДВДДДДДДДДВДДДДДї
і ірасш. і
Расширение команды: ДДДДДДДДДЕДДДДДДДДДДДДДцізнака і
А Д Д Д Д Д Д ДБДДДДДДДДБДДДДДЩ
Операнд
Непрямые регистровые режимы
ДДДДДДДДДДДДДДДДДДДДДДДДДДД
Эти режимы адресации определяет то, что операнд находится в
сегменте памяти и содержимое одного или нескольких регистров
используется для вычисления исполнительного адреса внутри
сегмента. Затем прибавляется адрес базы сегмента, что
формирует 20-битный линейный адрес операнда.
Непрямой режим с базовым регистром
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Регистры SI,DI,BX или BP могут служить базовым регистром,
содержащим адрес операнда памяти.
Вычисление: EA=(genreg)
Синтаксис Ассемблера: (genreg)
R/M: 100,101,110,111
Базовый регистр: SI,DI,BX,BP
31 15 0
Ъ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї
Базовый регистр:ДДДДДДДДДДДДДДДДДДц База і
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ
і
і ИСПОЛНИТЕЛЬНЫЙ
і АДРЕС
Д Д Д Д Д і Д Д
і
31 15 4 3 0 і
Адрес базыЪ Д Д Д Д Д Д ДВДДДДДДДДДВДДДДї і
і іСелектор і щ Сложение по
сегмента і00000000000000ісегмента 0000іДДДц+ 32
і і і і модулю 2
А Д Д Д Д Д Д ДБДДДДДДДДДБДДДДЩ і
і
і ЛИНЕЙНЫЙ
щ АДРЕС
31 0
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
Адрес памяти: і Операнд і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Непрямой режим с базовым регистром и смещением
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Регистры SI,DI,BX или BP могут служить базовым регистром,
содержащим адрес, который прибавляется к смещению,
расширенному знаком. Затем прибавляется адрес сегмента базы,
что формирует 20-битный линейный адрес операнда.
Вычисление: EA=(genreg)
Синтаксис Ассемблера: (genreg)
R/M: 100,101,110,111
Базовый регистр: SI,DI,BX,BP
- 50 -
31 15 0
Ъ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї
Базовый регистр:ДДДДДДДДДДДДДДДДДДці База і
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ
31 15 0 і
Ъ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї і
і ірасширение і щ Сложение по
Смещение і і знака іДДДц+ 16
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і модулю 2
і
і ИСПОЛНИТЕЛЬНЫЙ
і АДРЕС
Д Д Д Д Д і Д Д
31 14 4 3 0 і
Адрес базыЪ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї і
і іСелектор і і щ Сложение по
сегмента і00000000000000ісегмента і0000ГДДДц+ 32
і і і і і модулю 2
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і
і ЛИНЕЙНЫЙ
щ АДРЕС
31 0
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
Адрес памяти: і Операнд і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Непрямой режим с базовым и индексным регистром
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Пары регистров BX+SI, BX+DI, BP+SI и BP+DI могут каждая
служить в качестве базового и индексного регистров, которые
складываются для формирования исполнительного адреса операнда
памяти. Затем, для формирования 20-битного линейного адреса,
добавляется адрес базы сегмента.
Вычисление: EA=(genreg)+(genreg)
Синтаксис Ассемблера: (genreg)+(genreg)
R/M: 000,001,010,011
Базовый регистр: BX+SI,BX+DI,BP+SI,BP+DI
31 15 0
Ъ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї
Базовый регистр:ДДДДДДДДДДДДДДДДДДці База і
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ
31 15 0 і
Ъ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї і
Индексный і і і щ Сложение по
регистр і і Индекс іДДДц+ 16
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і модулю 2
і
і ИСПОЛНИТЕЛЬНЫЙ
і АДРЕС
Д Д Д Д Д і Д Д
31 14 4 3 0 і
Адрес базыЪ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї і
і іСелектор і і щ Сложение по
сегмента і00000000000000ісегмента і0000іДДДц+ 32
і і і і і модулю 2
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і
і ЛИНЕЙНЫЙ
щ АДРЕС
31 0
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
Адрес памяти: і Операнд і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
- 51 -
Непрямой режим с базовым и индексным режимом и смещением
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Пары регистров BX+SI, BX+DI, BP+SI и BP+DI могут каждая
служить в качестве базового и индексного регистров, которые
складываются со смещением, расширенному знаком. Сумма
формирует исполнительный адрес операнда памяти. Затем, для
формирования 20-битного линейного адреса, добавляется адрес
базы сегмента.
Вычисление: EA=(genreg)+(genreg)+Расш(смещение)
Синтаксис Ассемблера: (genreg)+(genreg)+constant
R/M: 000,001,010,011
Базовый регистр: BX+SI,BX+DI,BP+SI,BP+DI
31 15 0
ЪДД Д Д Д Д Д ДВДДДДДДДДДДДДДДї
і і і
Базовый регистр:ДДДДДДДДДДДДДДДДДДці База і
і і і
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ
і
31 15 0 і
Ъ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї і
і расширение і і щ Сложение по
Смещение і знака і ГДДДц+ 16
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і модулю 2
і
31 15 0 і
Ъ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї і
Индексный і і щ Сложение по
регистр і Индекс іДДДц+ 16
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і модулю 2
і
і
і ИСПОЛНИТЕЛЬНЫЙ
і АДРЕС
Д Д Д Д Д і Д Д
і
31 14 4 3 0 і
Адрес базыЪ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї і
і іСелектор і і щ Сложение по
сегмента і00000000000000ісегмента і0000іДДДц+ 32
і і і і і модулю 2
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і
і
і ЛИНЕЙНЫЙ
і
щ АДРЕС
31 0
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
Адрес памяти: і Операнд і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Смещение
ДДДДДДДД
Исполнительный адрес определяется как абсолютный 16-битный
сдвиг от базы сегмента. Значение смещения задается в самой
команде.
- 52 -
31 15 0
Ъ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї
Смещение і і Смещение іДДДДї
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і
і
і ИСПОЛНИТЕЛЬНЫЙ
і АДРЕС
Д Д Д Д Д і Д Д
31 14 4 3 0 і
Адрес базыЪ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї і
і іСелектор і і щ Сложение по
сегмента і00000000000000ісегмента і0000іДДДц+ 32
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і модулю 2
і
і ЛИНЕЙНЫЙ
щ АДРЕС
31 0
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
Адрес памяти: і Операнд і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Непрямой режим с регистром SP и предварительным уменьшением
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Для команд PUSH, PUSHA, CALL и INT n, регистр SP содержит
адрес операнда памяти. Перед использованием регистра SP он
уменьшается на размер операнда данных, который вталкивается в
стек.
Вычисление: SP=SP-размер операнда
EA=SP
Синтаксис Ассемблера: Неявный с командами PUSH, PUSHA,
CALL и INT n
Базовый регистр: SP
31 15 0
Ъ Д Д Д Д Д Д ДВДДДДДДДДДДДДДї
Регистр SP: ДДДДДДДДДДДДДДДДДДДДДДДДці База і
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДЩ
і ш
і і
і і
щ і
Размер операнда: ДДДДДДДДДДДДДДДДДДДДДДДДДДц - і
ГДДДДДДЩ
і ИСПОЛНИТЕЛЬНЫЙ
і АДРЕС
Д Д Д Д Д і Д Д
31 14 4 3 0 і
Адрес базыЪ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї і
і іСелектор і і щ Сложение по
сегмента і00000000000000ісегмента і0000іДДДц+ 32
і і і і і модулю 2
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і
і
і ЛИНЕЙНЫЙ
щ АДРЕС
31 0
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
Адрес памяти: і Операнд і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
- 53 -
Непрямой режим с регистром SP и последующим увеличением
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Для команд POP, POPA, RET и IRET регистр SP содержит адрес
операнда памяти. После использования регистр увеличивается на
размер операнда данных, который только что был вытолкнут из
стека.
Вычисление: EA=SP
SP=SP+размер операнда
Синтаксис Ассемблера: Неявный с командами POP, POPA,
RET и IRET
Базовый регистр: SP
31 15 0
Ъ Д Д Д Д Д Д ДВДДДДДДДДДДДДДї
Регистр SP:ДДДДДДДДДДДДДДДДДДДДДДДці База і
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДЩ
ш і
і і
Размер операнда: ДДДДДДДДДДДДДДДДДДДДДДц + і
ш і
і і
АДДДґ ИСПОЛНИТЕЛЬНЫЙ
і АДРЕС
Д Д Д Д Д і Д Д
31 14 4 3 0 і
Адрес базыЪ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї і
і іСелектор і і щ Сложение по
сегмента і00000000000000ісегмента і0000іДДДц+ 32
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і модулю 2
і
і ЛИНЕЙНЫЙ
щ АДРЕС
31 0
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
Адрес памяти: і Операнд і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Непрямые режимы памяти
ДДДДДДДДДДДДДДДДДДДДДД
Соответствующие формы команд JMP и CALL используют непрямую
адресацию. Режимы непрямой адресации предлагают всю гибкость
регистровых непрямых режимов, которые описаны в предыдущем
разделе.
Для команд JMP и CALL внутри кодового сегмента непрямая
адресация памяти работает следующим образом: для генерации
16-битного смещения суммируются компоненты адреса, а затем,
для формирования двадцатибитного линейного адреса,
прибавляется адрес базы сегмента. Этот участок памяти содержит
16-битный исполнительный адрес команды назначения внутри
текущего кодового сегмента.
Для команд JMP и CALL, вызывающих другой кодовый сегмент,
непрямая адресация памяти работает следующим образом: для
генерации 16-битного смещения суммируются компоненты адреса, а
затем, для формирования 20-битного линейного адреса,
прибавляется адрес базы сегмента. Этот участок памяти содержит
полный адрес (16-битный исполнительный адрес команды
назначения и 16-битный селектор кодового сегмента назначения).
Все 32 бита полного адреса загружаются и используются для
выборки программы назначения.
- 54 -
Вычисление: EA=[(genreg)+(genreg)+Расш(смещение)]
Синтаксис Ассемблера: ptr(genreg)+(genreg)+constant
R/M: 000,001,010,011,100,101,110,111
Базовый регистр: BX+SI,BX+DI,BP+SI,BP+DI,SI,DI,BX,BP
31 15 0
Ъ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї
Базовый регистр:ДДДДДДДДДДДДДДДДДДці База і
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ
31 15 0 і
Ъ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї і
і ірасширение і щ Сложение по
Смещение і і знака ГДДДц+ 16
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і модулю 2
31 15 0 і
Ъ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї і
Индексный і і і щ Сложение по
регистр і і Индекс іДДДц+ 16
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і модулю 2
і
і ИСПОЛНИТЕЛЬНЫЙ
і АДРЕС
Д Д Д Д Д і Д Д
31 14 4 3 0 і
Адрес базыЪ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї і
і іСелектор і і щ Сложение по
сегмента і00000000000000ісегмента і0000ГДДДц+ 32
і і і і і модулю 2
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і
і ЛИНЕЙНЫЙ
щ АДРЕС
31 15 0
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
Непрямой адрес памяти: і Непрямой адрес памяти і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
щ
31 15 0
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і Смещение от і
Смещение команды: інепрямого адреса памяти і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
і
Указывает на
31 14 4 3 0 і
Адрес базыЪ Д Д Д Д Д Д ДВДДДДДДДДДДДДДДї і
і іСелектор і і щ Сложение по
сегмента і00000000000000ісегмента і0000іДДДц+ 32
А Д Д Д Д Д Д ДБДДДДДДДДДДДДДДЩ і модулю 2
от непрямого адреса памяти і
і ЛИНЕЙНЫЙ
щ АДРЕС
31 0
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
Адрес команды: і Адрес назначения команды і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Кодирование режимов 16-битной адресации
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Большинство команд задают местоположение операнда байтом MOD
R/M. Для большинства команд байт MOD R/M полностью определяет
режим адресации, использованный для операнда источника и
операнда назначения. Либо операнд источника либо операнд
назначения является общим регистром. Второй операнд может быть
- 55 -
общим регистром или адресом памяти. Если второй операнд
является адресом памяти, это определяет режим адресации. Чтобы
определить оба операнда, байт MOD R/M содержит три поля.
Байт 0 Байт 1
(кодоп) (MOD R/M)
ГДВДВДВДВДВДВДВДЕДВДВДВДВДВДВДВДї
* * * * * * * *
АДБДБДБДБДБДБДБДБДБДБДБДБДБДБДБДЩ
ЪДДДЩ ЪДЩ ЪДДДЩ
REG MOD R/M
АДДДЩ АДДДДДДДЩ
Операнд 1 Операнд 2
Рис.4.3. Двухоперандная инструкция с байтом MOD R/M.
Байт MOD R/M следует за байтом (байтами) кода команды
80386, как показано на рис. 4.3. Байт MOD R/M делится на три
поля, показанные на рисунке. Трехбайтное поле REG определяет
регистровый операнд. Двубитное поле MOD определяет является ли
второй операнд также регистровым; если является, то 3-битное
поле R/M определяет другой регистровый операнд. Если, с другой
стороны, поле MOD показывает, что операнд находится в памяти,
то поля MOD и R/M вместе определяют использованный режим
адресации.
Таблица 4.1 определяет поля MOD R/M и включает все
16-битные режимы адресации памяти. Заметьте, что в этих
режимах используются только регистры DX,SI,DI,BP. (Регистр SP
неявно используется для адресации памяти командами
PUSH,POP,PUSHA,POPA,CALL и INT n). Когда режим адресации
задает только базовый регистр, базой могут являться регистры
DX,SI,DI, или BP. Когда специфицированы базовый и индексный
регистры, то такими парами могут быть BX+SI,BX+DI,BP+SI,BP+DI.
Смещение может задаваться как 16-битныя величина или 8-битная
величина (расширенная со знаком до 16 бит).
Возможны различные комбинации компонент адреса при
использовании байта MOD R/M, как показано в таблице 4.1.
Таблица 4.1 Определение байта MOD R/M для 16-битной адресации
(MOD R/M)
ЕДВДВДВДВДВДВДВДї
БДБДБДБДБДБДБДБДЩ
ЪДДДЩ ЪДЩ ЪДДДЩ
REG MOD R/M
АДДДЩ АДДДДДДДЩ
Операнд 1 Операнд 2
- 56 -
REG Операнд 1 = MOD R/M Операнд 2 =
ДДДДДДДДДДДДДДДДДДДДДД ДДДДДДДДДДДДДДДДДДДДДДДДДДДД
000 регистр EAX/AX/AL 00 000 память DS:[BX+SI]
001 регистр ECX/CX/CL 00 000 память DS:[BX+DI]
010 регистр EDX/DX/DL 00 000 память SS:[BP+SI]
011 регистр EBX/BX/BL 00 000 память SS:[BX+DI]
100 регистр ESP/SP/AH 00 000 память DS:[SI]
101 регистр EBP/BX/CH 00 000 память DS:[DI]
110 регистр ESI/SI/DH 00 000 память DS:d16
111 регистр EDI/DI/BH 00 000 память DS:[BX]
ДДДДДДДДДДДДДДДДДДДДДД ДДДДДДДДДДДДДДДДДДДДДДДДДДДД
01 000 память DS:[BX+SI+d8]
01 000 память DS:[BX+DI+d8]
01 000 память SS:[BX+SI+d8]
01 000 память SS:[BX+SI+d8]
01 000 память DS:[SI+d8]
01 000 память DS:[DI+d8]
01 000 память DS:[BX+d8]
01 000 память DS:[BP+d8]
ДДДДДДДДДДДДДДДДДДДДДДДДДДДД
01 000 память DS:[BX+SI+d16]
01 000 память DS:[BX+DI+d16]
01 000 память SS:[BX+SI+d16]
01 000 память SS:[BX+SI+d16]
01 000 память DS:[SI+d16]
01 000 память DS:[DI+d16]
01 000 память DS:[BX+d16]
01 000 память DS:[BP+d16]
ДДДДДДДДДДДДДДДДДДДДДДДДДДДД
10 000 регистр EAX/AX/AL
10 001 регистр ECX/CX/CL
10 010 регистр EDX/DX/DL
10 011 регистр EBX/BX/BL
10 100 регистр ESP/SP/AH
10 101 регистр EBP/BX/CH
10 110 регистр ESI/SI/DH
10 111 регистр EDI/DI/BH
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
- 57 -
Глава 5
Детальное описание 16-битных команд
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
В этой главе обсуждаются команды 80386, как они
используются программистом в реальном режиме.
В 16-битном реальном режиме команды сконструированы так,
что они функционируют так же, как и на 8086. Доступны размеры
операндов в 8 бит и 16 бит, и 16-битные режимы адресации
используются так, как это описано в главе 4. Все это
поддерживает совместимость с 8086 в 16-битных режимах.
Однако в эти режимы проникают некоторые новые черты 80386.
Следовательно, строго говоря, реальный режим 80386 является
более эффективным, чем 8086 или реальный режим 80286. Регистры
отладки 80386 доступны в 16-битных режимах, и 16-битные
утилиты отладчика могут использовать их для создания
дополнительных возможностей отладки. Два новых сегментных
регистра, FS и GS, могут использоваться для повышения
эффективности программ. Доступны операции манипуляции с битами
и операции двойного сдвига, а также регистры теста страниц и
управляющие регистры, хотя они необходимы только при
подготовке к вхождению в защищенный режим.
Доступность команд
ДДДДДДДДДДДДДДДДДД
В 16-битном реальном режиме 80386 имеет 32 новые команды,
по сравнению с реальным режимом 80286. В реальном режиме 80386
доступны новые, использующие полное смещение, формы команды
JCC (условный переход) и полная форма команды IMUL (Умножение
целых со знаком). Таблица 5.1 представляет все эти дополнения
в реальном режиме и сравнивает их с системой команд 8086.
Таблица 5.1 особенна интересна при написании программы для
разных поколений 86. Она приводит команды и формы команд,
которые можно использовать для оптимизации программ для 80286
и 80386 в реальном режиме.
Таблица 5.1 Команды реального режима, недоступные на 8086.
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Дополнения в Дополнения в
реальн. режиме реальн. режиме Описание
80286 80386
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
BOUND BOUND проверить границы массива
ENTER ENTER создать кадр стека
IMUL # IMUL # непоср. умножение со знаком
INS INS ввод цепочки
LEAVE LEAVE устранить кадр стека
OUTS OUTS вывод цепочки
POPA POPA вытолкнуть общие регистры
PUSHA PUSHA протолкнуть общие регистры
PUSH # PUSH # протолкнуть данные
REP INS REP INS повтор ввода цепочки
REP OUTS REP OUTS повтор вывода цепочки
shift/rotate shift/rotate сдвиг/вращение по непосредств.
by count by count счетчику
BT тест бита
BTC тест бита и дополнение
BTR тест бита и сброс
BTS тест бита и установка
IMUL общая умн. общего регистра со знаком
MOV CRn перем. в/из регистр управления
MOV DRn перем. в/из регистра отладки
MOV TRn перем. в/из регистра теста стр.
Jcc full displ условный перех. - полное смещ.
Scc установить байт условно
SHLD двойной сдвиг влево
SHRD двойной сдвиг вправо
- 58 -
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Дополнения в Дополнения в
реальн. режиме реальн. режиме Описание
80286 80386
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Команды защищенного режима
CLTS CLTS очистить флаг перкл. задания
* *
LIDT LIDT загрузить регистр IDTR
SIDT SIDT запомнить регистр IDTR
* *
LGDT LGDT загрузить регистр GDTR
SGDT SGDT запомнить регистр GDTR
* *
LMSW LMSW загрузить слово сост. машины
SMSW SMSW запомнить слово сост. машины
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Эти команды защищенного режима доступны в реальном режиме при
подготовке инициализации защищенного режима.
Однако не все команды 80386 (помещенные в таблицах
3.1-3.10) доступны в реальном режиме 80386. Девять команд
защищенного режима, которые не могут исполняться в реальном
режиме, представлены в таблице 5.2.
Таблица 5.2 Команды 80386, недоступные в реальном режиме
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Мнемониа команды Описание
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
LTR загрузить регистр задания
STR запомнить регистр задания
LLDT загрузить локальный дескриптор табл. рег.
SLDT запомнить локальный дескриптор табл. рег.
ARPL настроиться на уровень приоритета
LSL загрузить границу сегмента
LAR загрузить право доступа
VERR проверить право доступа по чтению
VERW проверить право доступа по записи
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Первые четыре команды недоступны, потому что регистры TR и
LDTR недоступны и не требуются в реальном режиме, а последние
пять недоступны, потому что концепции уровня приоритета,
настраиваемой границы сегмента (в реальном режиме граница
всегда 64 Кбайт) и прав доступа не существуют в реальном
режиме.
Доступность префиксов
ДДДДДДДДДДДДДДДДДДДДД
Все префиксы 80386, показанные на рис. 3.1, доступны в
реальном режиме. Префиксы размера операнда и размера адреса, в
частности, могут добавить новые возможноти в программирование
в реальном режиме, так как они допускают 32-битные операнды
данных и 32-битные режимы адреса. Эти префиксы могут быть
полезными в программировании в реальном режиме для 32-битных
операций.
Префикс размера операнда позволяет легко манипулировать
32-битными операндами данных. Например, использование префикса
размера операнда позволяет 80386 в реальном режиме выполнять
арифметические операции над 32-битными операндами и
обрабатывать цепочки по 32 бита за одну операцию.
Доступный в реальном режиме префикс размера адреса
открывает доступ к 32-битным режимам адресации, рассмотренным
в главе 7. Например, он может использоваться в
- 59 -
масштабированной индексной адресации. Правильное использование
префикса размера адреса в реальном режиме требует большой
осторожности, потому что необходимо избегать генерирование
больших исполнительных адресов. Исполнительный адрес
превышающий 65535 в реальном режиме выходит за границу
сегмента, которая в этом режиме фиксирована и равна 65535.
Поэтому для успешного использования префикса размера адреса в
реальном режиме биты 31-16 регистров, применяющихся при
адресации, и сумма компонент адреса не должна превышать 65535
(потому что в 32-битных режимах адресации компоненты
32 16
складываются по модулю 2 ,а не 2 ).
Подытоживая, следует сказать, что при аккуратном
использовании префиксы размера операнда и адреса могут
расширять возможности программ в реальном режиме. Для
полностью нового 32-битного программирования должен однако
рассматриваться защищенный режим, так как в этом режиме
размеры сегмента и пространства линейных адресов много больше,
чем в реальном режиме.
Предел размера сегмента в реальном режиме
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
В реальном режиме максимальный размер сегмента равен 64 Кбайт
или 65536 байт. Поэтому граница сегмента равна 0FFFFh (т.е.
64K-1 или 65535 байт) - максимально допустимый байт смещения.
Этот предел в реальном режиме устанавливается автоматически
для всех сегментов и поэтому требует, чтобы исполнительный
адрес не превышал 64K-1. В случае многобайтных операндов этот
предел требует, чтобы весь операнд имел смещение не большее
64K-1. В реальном режиме попытка доступа к операндам, которые
полностью или частично лежат за 64K-1 пределом сегмента,
вызовет нарушение. Чтобы избегать таких нарушений, не
позволяйте операндам лежать за границей 64K-1 и будьте очень
аккуратны при любом использовании префикса размера адреса,
т.к. вычисление 32-битного адреса может легко привести к
смещению, превышающему границу 64K-1, разрешенную в реальном
режиме. Нарушения границы сегмента далее описаны в главе 6.
Глава 6
Прерывания и исключения в реальном режиме
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Эта глава описывает реакцию 80386 на возникающие в реальном
режиме прерывания и исключения. Как и следует ожидать, в
реальном режиме реакция 80386 очень похожа на реакцию 8086.
Перед более глубоким погружением в реакции процессора опишем
подробно сами события.
Прерывания и исключения - похожие типы событий. Оба
приостанавливают текущую операцию 80386 и передают управление
сервисной программе обработки прерываний или исключений. Они
вызывают переход 80386 от текущего потока команд к сервисной
программе обработки события. Различия между прерываниями и
исключениями возникают из-за различных источников их
возникновения: Прерывания возникают из-за важных внешених
событий, сигналы которых поступают на 80386 на выделенные
контакты; исключения возникают из-за внутренних условий или
проблем, которые детектирует 80386.
- 60 -
Распознование прерываний и исключений
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
С точки зрения программиста, прерывания и исключения
распознаются на границе команд, то есть они распознаются после
того, как одна команда завершилась и перед тем, как следующая
команда началась. Это упрощает жизнь программиста, особенно
при взаимодействии с исключениями, так как он обходится без
нюансов временных внутренних регистров 80386 или состояний
ожидания. 80386 выполняет всю необходимую поддержку и
служебные действия автоматически и обрабатывает прерывания и
исключения ровно на границе команд.
Прерывания
ДДДДДДДДДД
Прерывания обеспечивают аппаратный механизм, позволяющий 80386
взаимодействовать с внешним окружением, которое обычно
включает многообразные внешние события, случающиеся через
непредсказуемые интервалы времени. Наступление такого события
может быть сигнализировано 80386 по одному из двух входов:
INTR (маскируемый вход прерываний) или NMI (немаскируемый вход
прерываний). Эти два входных контакта 80386 посвещены
сигнализации прерываний.
Вход INTR индицирует активное прерывание, управляемое с
высокого уровня. Этот сигнал, который можно маскировать
программно, позволяется, когда IА бит EFLAGа установлен в 1, и
не позволяется, когда он установлен в 0.
Сигнал NMI индуцирует активное прерывание, вызываемое
нарастающим фронтом, и поэтому не требующее, чтобы
поддерживался высокий уровень на длительный период. NMI не
маскируется программно: он всегда позволяется. NMI обычно
резервируется для наиболее критических прерываний, для
прерываний, которые сигнализируют о фатальных условиях, таких
как сбой питания или некорректируемый сбой памяти.
Аппартные прерывания
ДДДДДДДДДДДДДДДДДДДД
Внутри систем на 80386 многие периферийные устройства, такие
как диски, таймеры, принтеры и другие важные приборы, могут
вызывать прерывания. Такие общие прерывания обычно
направляются на вход INTR 80386. Так как вход INTR только
один, прерывания от многих приборов логически складываются для
формирования сигнала INTR от многих приборов. Чтобы достичь
быстрой реакции на прерывание, желательно сразу же определить
источник прерывания.
Когда активизируется сигнал INTR, сразу же происходит
идентификация благодаря использованию специального цикла, в
течении которого 80386 читает ряд нижних байтов шины данных.
Этот ряд, от 00h до FFh, называется вектором прерываний и
обычно поставляется микросхемой контроллера прерываний, 8239A
или эквивалентной. Номер прерывания указывает 80386 на
конкретный указатель, резидентно находящийся в памяти, -
вектор, с помощью которого 80386 выбирает первую команду
программы обработки прерываний.
Когда, однако, активизируется вход NMI, никакой специальный
цикл не выполняется и вектор не читается, потому что NMI
автоматически связывается с номером прерываний 02h. Для этого
прерывания вектор 02h посвящен обслуживанию критического
немаскируемого вектора прерываний; при возникновении NMI 80386
передает управление программе обработки прерываний с номером
02h.
- 61 -
Векторы прерываний
ДДДДДДДДДДДДДДДДДД
В реальном режиме вектора прерываний являются полными адресами,
в стиле 16-битной адресации: 16-битный селектор и 16-битное
смещение, как показано на рис. 6.1 Вектор прерывания - это
адрес входа в программу, использующуюся для обработки
прерываний. Таким образом, вектор прерываний перенаправляет
80386 на программу обработки прерываний.
Вектор прерываний также служат для передачи управления
80386 в случае определения исключения, как показано на стр.
72.
Вектор прерываний в реальном режиме
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
(содержит точку входа в программу обработки прерываний)
15 0 15 0
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Селектор 16-битное смещение
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Рис. 6.1 Вектор прерываний в реальном режиме является полным
адресом (full ptr)
Таблица векторов прерываний
ДДДДДДДДДДДДДДДДДДДДДДДДДДД
Как было упомянуто, все вектора прерываний являются
резидентами в памяти и образуют массив векторов, называемый
таблицей векторов прерываний. Эта таблица, находящаяся с
линейного адреса 0, состоит из 256 векторов, индексированных
от вектора 0 до вектора 255, что конечно соответствует
возможной величине числа векторов прерываний. Важно: вектора
аппаратных прерываний должны быть пронумерованы от 32 до 255.
Прерывания от 0 до 31 зарезервированы для исключительных
ситуаций, определяемых 80386. Таким образом, прерывание 32
передает управление, используя вектор 32; и так далее до
прерывания 255. Таблица векторов прерываний показана на рис.
6.2.
31 16 15 0
ЪДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДї
і Селектор 255 і Смещение 255 іВектор 255 по адресу 000007FCh
ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДґ
і Селектор 254 і Смещение 254 іВектор 254 по адресу 000007F8h
ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДґ
і Селектор 253 і Смещение 253 іВектор 253 по адресу 000007F4h
ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДґ
. .
. .
ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДґ
і Селектор 2 і Смещение 2 іВектор 2 по адресу 00000008h
ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДґ
і Селектор 1 і Смещение 1 іВектор 1 по адресу 00000004h
ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДґ
і Селектор 0 і Смещение 0 іВектор 0 по адресу 00000000h
АДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДЩ
Это иллюстрирует местоположение и размер таблицы векторов
прерываний в реальном режиме после установки. На самом деле,
команда LIDT может быть использована в реальном режиме для
установки базы таблицы векторов прерываний и ее границы, но в
этом случае продолжение работы в реальном режиме создаст его
нестандартное окружение.
Рис. 6.2 Таблица векторов прерываний в реальном режиме
- 62 -
Замечание: Архитектура IBM PC противоречит предыдущему
замечанию, т.е. аппартное прерывания не используют номера
векторов от 0 до 32. BIOS PC инициализирует микросхему
контроллера прерываний 8259А для использования векторов 8-15
для аппартных прерываний. Потенциально это может приводить к
конфликтному использованию различных номеров векторов
прерываний.
Таблица векторов прерываний также используется для
перенаправления 80386 в случае определения исключения, как
показано ниже в этой главе.
Выполнение программ обработки прерываний
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Программы обработки прерываний - это программы, выполняемые
при передаче управления 80386 согласно таблице векторов
прерываний. Обычно это программы, обслуживающие прибор,
вызвавший прерывание. Данная программа n, для прерывания или
исключения n, может быть активизирована аппаратным или
программным управлением, как показано ниже:
Аппаратное управление. Если маскируемые прерывания позволены
(флаг IF=1), происходит активизирование INTR и выборка вектора
n. Когда высокий уровень на входе INTR активизирует программу
обработки прерываний n, флаг IF устанавливается в 0,
предотвращая дальнейшую активизацию любой программы сигналом
INTR до тех пор, пока флаг IF не будет установлен в 1. Сигнал
NMI активизирует программу обработки прерываний 2, независимо
от значения флага IF.
Когда нарастающий фронт активизирует программу обработки
прерываний 2 по сигралу NMI, флаг IF устанавливается в 0,
предотвращая активизацию любых программ по INTR. Более того,
пока не будет выполнена команда IRET (обычно в конце программы
обработки прерываний 2), другой нарастающий фронт не будет
активизировать эту программу. Это предотвращает порождение
многочисленных вложенных вызовов программы обработки
прерываний 2 при возникновении неровного растущего фронта.
Однако один растущий фронт NMI запоминается, если он возникает
в течениии служебной программы NMI; затем он снова
активизирует программу обработки прерываний 2 как только
закончится первый вызов (если быть более точным, как только он
выполнит команду IRET ).
Замечание по совместимости: 8086 и 8088 не запирают
последующие сигналы NMI после того, как произойдет первый.
Если по некоторой причине вы захотите, чтобы 80286 или 80386
также воспринимал последующие NMI, выполните команду IRET
ранее в программе NMI. Чтобы исполнить IRET находясь в
программе обработки NMI, посторойте сначала кадр стека с тремя
командами PUSH, так что IRET "вернется" к следующей команде,
как показано ниже:
NMI_ENTRY: PUSHP
PUSH CS
PUSH NEXT_INSTR ;выталкивает смещение команды,
;следующей за IRET
IRET
NEXT_INSTR ;IRET ВОЗВРАЩАЕТСЯ СЮДА. Будут
;восприняты NMI, если случатся
. ;тело программы обработки
. ; прерываний NMI
.
IRET ;
- 63 -
Программное управление. Выполняется команда INT n независимо
от состояния флага IF. Когда команда INT n активизирует
программу обработки прерываний n, флаг IF не устанавливается;
это позволяет аппаратным прерываниям прерывать программы
обработки прерываний, вызванных программно. Это необходимое
соглашение поддерживает реакцию 80386 на аппаратные средства,
окружающие систему.
Обработка прерываний
ДДДДДДДДДДДДДДДДДДДД
Обработка прерываний - это действия 80386 по передаче
управления программе обработки прерываний. При активизации
INTR, эти действия включают чтение с шины номера вектора
прерываний, запоминания состояния текущей программы, чтение
соответствующего вектора прерываний, и переход по адресу,
находящемуся в векторе прерываний. Если прерывание поступает
по NMI или по INTR, в то время, когда прерывания разрешены,
его обработка начинается, как только закончится текущая
команда. При появлении команды INT n, обработка прерываний
выполняется этой командой. Таблица 6.1 излагает шаги при
обработке прерываний, возникающей по сигналам INTR и NMI или
по команде INT n.
Таблица 6.1 Последовательность обработки прерываний
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Прерывания, вызванные
INTR NMI INT n
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
1. Получить число
вектора n из контрол-
лера прерываний, вы-
полнив два специаль-
ных цикла: циклы
"Распознования пре-
рываний"
2.Протолкнуть FLAG 1.Протолкнуть FLAG 1.Протолкнуть FLAG
по стеку по стеку по стеку
3.Протолкнуть CS 2.Протолкнуть CS 2.Протолкнуть CS
по стеку по стеку по стеку
4.Протолкнуть IP 3.Протолкнуть IP 3.Протолкнуть IP
по стеку по стеку по стеку
5.Установить IF 4.Установить IF
в 0 в 0 и запереть NMI
6.Прочесть вектор 4.Прочесть вектор 3.Прочесть вектор
прерываний n. прерываний 2 прерываний n
Поместить селектор Поместить селектор Поместить селектор
в CS и смещение в в CS и смещение в в CS и смещение в
IP IP IP
7.Начать выполнение 5.Начать выполнение4.Начать выполнение
во входной точке во входной точке во входной точке
(CS:IP) (CS:IP) (CS:IP)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
- 64 -
Исключения
ДДДДДДДДДД
Исключения - это внутренние события процессора. Исключения
происходят, когда 80386 определяет проблему, которая мешает
выполнению следующей команды. Распознаются несколько категорий
исключений, и каждой присваевается фиксированное число n в
интервале 0-31. Этот интервал специально зарезервирован под
исключения; прерываниям не должны присваиваться номера из
этого интервала.
В реальном режиме 80386 опознает несколько типов
исключений, как показано ниже. В защищенном режиме и
виртуальном 8086 режиме 80386 опознает дополнительные типы
исключений, описанные в главе 16.
Для обработки этих состояний, также как и прерываний,
требуются обслуживающие программы. Они называются программами
обработки исключений. Таблица векторов прерываний используется
для передачи управления этим программам, в зависимости от
номера n, присвоенного типу случившегося исключения.
Распознование
ДДДДДДДДДДДДД
Когда команда вызывает исключение, оно всегда распознается.
Нет метода для маскировки исключений, да он и нежелателен.
Хотя исключения возникают и распознаются во время
выполнения команды, исключения проявляются на границе команд,
так как состояние 80386 всегда сохраняется таким, каким оно
было до этой команды. Таким образом CS:IP указывает на команду
(включая байты префиксов), которая вызвала исключение. Это
идеально для служебной программы, устраняющей исключения,
потому что она может вернуться к программе просто выполнив
команду IRET по завершении своей работы.
80386 в реальном режиме распознает 12 категорий исключений,
те же, что в реальном режиме распознает 80286. Из 12
исключений, 5 существуют для 8086, 2 посвящены сообщениям
сопроцессора о численных ошибках, одно для сообщения о
неверном коде команды, и четыре для сообщения различных
нарушений границы сегмента. Краткое изложение дано в таблице
6.2.
Таблица 6.2 Назначение векторов исключений в реальном режиме
ДДВДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДї
N іИмя (и тип)іОписание і Детектируется ли і
і і і і
і і ів реальном 8086/88? і
і і ірежиме? і
ДДЕДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДґ
0 іОшибка іБыла попытка деления і да іДа, однако і
іделения іна 0 командами DIV і і8086 CS:IP і
і(ошибка) іили IDIV і іуказывают на і
і і і ікоманду, иду-і
і і і іщую после DIVі
і і і іили IDIV і
1 іОдин шаг іЕсли флаг IF в FLAG і да іДа, но 8086 і
і(ловушка) іустановлен в 1, это і іимеет только і
іПрерывание іисключение происходиті іфлаг TF. У і
ів регистре іпосле следующей ко- і інего нет ре- і
іотладки іманды. Регистры отла-і ігистров от- і
і(ловушка ідки могут определить і іладки і
іили ошибка)іпрерывание, что такжеі і і
і івызывает исключение 1і і і
3 іКод преры- іОднобайтный код пре- і да і да і
івания ірывания (CCh) выпол- і і і
і(ловушка) іняется. Процессор вы-і і і
і ізывает исключение 3 і і і
- 65 -
ДДВДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДї
N іИмя (и тип)іОписание і Детектируется ли і
і і і і
і і ів реальномі 8086/88? і
і і ірежиме? і і
ДДЕДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДґ
4 іINTO іЕсли установлен флаг і да і да і
і(ловушка) іпереполнения 0F, про-і і і
і іцессор вызывает ис- і і і
і іключение 4 і і і
і і і і і
5 іBOUND іЕсли определено нару-і да і да і
і(ловушка) ішение границ, процес-і і і
і ісор вызывает исключе-і і і
і іние 5 і і і
і і і і і
6 іНеправильн.іНеприсвоенные коды і і і
і і і да іНет, 8086 і
ікод командыіопераций вызывают і і і
і і і ірассматриваеті
і(ошибка) іинициацию 80386 і і і
і і і інеправильный і
і іисключения 6 і і і
і і і ікод как NOP і
і і і і і
7 іСопроцессоріКод сопроцессора вы- іДа, если іНет, чтобы і
інедоступен ізывает исключение 7, іфлаг EM в іэмулировать і
і(ошибка) ікогда сопроцессор іCRO уста- ісопроцессор ві
і інедоступен. Позволяетіновлен в 0ісистеме 8086 і
і іэмуляцию команд со- і ікод процессо-і
і іпроцессора если флаг і іра должен і
і іEM в CRO установлен і ібыть заменен і
і ів 0 і іна команды і
і і і іINT n, кото- і
і і і ірые вызывают і
і і і іобработку і
і і і іисключения n і
і і і і і
8 іДвойная іДетектируется ошибка іДа, но треінет і
іошибка іпри попытке доступа кібует нети-і і
і(ошибка) іпрограммам обработки іпичного исі і
і іпрерываний или исклю-іпользован.і і
і ічений ікоманды і і
і і іLIDT для і і
і і іуменьш. і і
і і іграницы і і
і і ітаблицы і і
і і іпрерыванийі і
і і і і і
9 іНарушение іОперанд для сопроцес-іДа, но іНет, 8086 по-і
іграницы ісора частично нахо- ітолько ес-ізволяет опе- і
іоперанда ідится за границей іли програ-ірандам пере- і
ісопроцессора сегмента іммное обе-іходить за і
і(ошибка) і іспея. пе- іграницу сег- і
і і іреносит імента і
і і іоперанд заі і
і і іграницу і і
і і і64K і і
- 66 -
ДДВДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДї
іИмя (и тип)іОписание і Детектируется ли і
і і і і
і і ів реальномі 8086/88? і
і і ірежиме? і і
ДДЕДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДґ
12іИсключение іОперанд сегмента сте-і то же і то же і
ісегмента іка (SS) полностью илиі і і
істека ічастично находится заі і і
і(ошибка) іграницей сегмента.Илиі і і
і істек не существует. і і і
і іИли неверный уровень і і і
і іпривилегий. Или не і і і
і ісегмент данных. А так- і і
і іже некоторые другие і і і
і іпримеры, изложенные і і і
і ів детальном описании і і і
і іисключения 12 і і і
і і і і і
13іИсключение іОперанд в CS,SS,ES,FSі то же і то же і
іобщей іGS полностью или час-і і і
ізащиты в CSітично лежит за преде-і і і
іSS,DS,ES,FSілами сегмента. Или смі і і
іили GS іпредыдущее исключениеі і і
і(ошибка) і і і і
і і і і і
16іЧисленная іАктивизируется 80386 іДа,если іНет, 8087 сиг-
іошибка іERROR# вход (предпо- івход 80386інализирует о і
ісопроцессораложительно сопроцес- іERROR# былічисленной і
і(ошибка) ісором) іактивизи- іошибке сопро-і
і і ірован іцессора 8086 і
і і і80387 вы- іпосредством і
і і іходом со- іпрерывания і
і і іпроцессораі(обычно черезі
і і і і8259А, но в і
і і і іархитектуре і
і і і іPC через NMI і
ДДБДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДДДДДЩ
Так как 8086 распознает только пять категорий исключений
у 80386 в реальном режиме могут возникать проблемы
совместимости. Так как исключения, распознаваемые 80386
являются расширением исключений 8086, 80386 является более
различающим, чем его предшественник. Для всех практических
целей поддерживается совместимость, так как дополнительные
исключения 9,12 и 13 (нарушения границы) вызываются только
необычными программами 8086 (например, переносом многобайтного
операнда через начало сегмента), не присутствующими в
коммерческих программах. Дополнение исключения 7, Сопроцессор
недоступен, не является проблемой, потому что техника 8086 по
эмуляции сопроцессора также хорошо работает на 80386.
Исключение 16 происходит только когда сигнал ERROR#
сопроцессора соединен с входным контактом ERROR# 80386;
однако, такое соединение необязательно, и PC, базирующаяся на
80386 не активизирует исключение 16, так как выход
сопроцессора ERROR# посылается на вход процессора NMI, также
как и в PC, базирующихся на 8088.
Детали обработки исключений
ДДДДДДДДДДДДДДДДДДДДДДДДДДД
Дополнительная детальная информация о каждом исключении
приведена в главе 16.