В этой главе обсуждаются команды 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 двойной сдвиг вправо
Команды защищенного режима
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 доступны в реальном режиме.
Префиксы размера операнда и размера адреса, в частности, могут
добавить новые возможноти в программирование в реальном режиме,
так как они допускают 32-битные операнды данных и 32-битные
режимы адреса. Эти префиксы могут быть полезными в
программировании в реальном режиме для 32-битных операций.
Префикс размера операнда позволяет легко манипулировать
32-битными операндами данных. Например, использование префикса
размера операнда позволяет 80386 в реальном режиме выполнять
арифметические операции над 32-битными операндами и
обрабатывать цепочки по 32 бита за одну операцию.
Доступный в реальном режиме префикс размера адреса
открывает доступ к 32-битным режимам адресации, рассмотренным
в главе 7. Например, он может использоваться в
масштабированной индексной адресации. Правильное использование
префикса размера адреса в реальном режиме требует большой
осторожности, потому что необходимо избегать генерирование
больших исполнительных адресов. Исполнительный адрес
превышающий 65535 в реальном режиме выходит за границу
сегмента, которая в этом режиме фиксирована и равна 65535.
Поэтому для успешного использования префикса размера адреса в
реальном режиме биты 31-16 регистров, применяющихся при
адресации, и сумма компонент адреса не должна превышать 65535.
Подытоживая, следует сказать, что при аккуратном
использовании префиксы размера операнда и адреса могут
расширять возможности программ в реальном режиме. Для
полностью нового 32-битного программирования должен однако
рассматриваться защищенный режим, так как в этом режиме
размеры сегмента и пространства линейных адресов много больше,
чем в реальном режиме.
В реальном режиме максимальный размер сегмента равен 64 Кбайт
или 65536 байт. Поэтому граница сегмента равна 0FFFFh (т.е.
64K-1 или 65535 байт) - максимально допустимый байт смещения.
Этот предел в реальном режиме устанавливается автоматически
для всех сегментов и поэтому требует, чтобы исполнительный
адрес не превышал 64K-1. В случае многобайтных операндов этот
предел требует, чтобы весь операнд имел смещение не большее
64K-1. В реальном режиме попытка доступа к операндам, которые
полностью или частично лежат за 64K-1 пределом сегмента,
вызовет нарушение. Чтобы избегать таких нарушений, не
позволяйте операндам лежать за границей 64K-1 и будьте очень
аккуратны при любом использовании префикса размера адреса,
т.к. вычисление 32-битного адреса может легко привести к
смещению, превышающему границу 64K-1, разрешенную в реальном
режиме. Нарушения границы сегмента далее описаны в главе 6.
Содержание
Вперед