Содержание

Детальное описание 16-битных комманд

Детальное описание 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 двойной сдвиг вправо
Команды защищенного режима
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.
Содержание Вперед
Сайт создан в системе uCoz