END begin

В строках 15 и 16 листинга используется команда засылки операнда в аккуму­лятор (B8h). Однако в строке 18 наличие перед кодом этой команды префикса за­мены размера операнда (код 66h) определяет, что длина операнда равна 32 бита, и, следовательно, используется регистр ЕАХ. Префикс замены размера операнда включается в объектный модуль транслятором автоматически, если в программе указано мнемоническое обозначение 32-разрядного регистра, например, ЕАХ.

При отладке этой программы используется отладчик фирмы Borland (турбо дебаггер), использование которого для отладки программ подробно описывается в главе 4.

Для индикации содержимого 32-разрядных регистров требуется провести дополнительную настройку отладчика. Запустив отладчик, надо выбрать Основное меню®View®Registers. При этом откроется окно индикации содержимого регистров процессора. Затем необходимо вызвать локальное меню этого окна, нажав ALT-F10, выбрать в открывшемся меню пункт Registers 32 bit и нажать Enter. После этого стоявшее по умолчанию в этом пункте No сменится на Yes. Это обеспечит вы­вод на экран содержимого полных 32-разрядных регистров EAX...ESP взамен 16-разрядных регистров AX...SP. Окно отладчика с исходным состоянием программы и переменных показано на рисунке 1.6.

Рисунок 1.6 – Окно отладчика с исходным состоянием программы и переменных

Для иллюстрации выполнения 32-разрядного сложения надо выполнить программу до команды пересылки содержимого EAX в переменную sum включительно (строка программы 20). Для этого следует 5 раз нажать клавишу F7, которая вызывает покомандное выполнение программы. Результат такого выполнения показан на рисунке 1.7.

На рисунке 1.6 видно, что содержимое аккумулятора в окне просмотра регистров процессора и содержимое переменной sum в окне просмотре переменных нулевые. На рисунке 1.7 содержимое и аккумулятора и указанной переменной уже равно 99999999h (или 2576980377 десятичных), что является результатом сложения 12345678h и 87654321h.

Кроме значения рассматриваемой переменной в окне просмотра переменных указан еще тип переменной (dword) и ее адрес (6015:0000).

Рисунок 1.7 – Окно отладчика с результатом выполнения 32-разрядного сложения

В рассмотренном примере используются уже известные нам команды. Однако в систему команд современных процессоров включен ряд новых команд, выполнение кото­рых не поддерживается процессором 8086. Некоторые из этих команд впервые появились в процессоре 80386, другие – в процессорах i486 или Pentium. Ниже приве­ден список этих команд.

Команды общего назначения

bound – проверка индекса массива относительно границ массива.

bsf/bsr – команды сканирования битов.

bt/btc/btr/bts – команды выполнения битовых операций.

bswap – изменение порядка байтов операнда.

cdq – преобразование двойного слова в четверное.

cmpsd – сравнение строк по двойным словам.

cmpxchg – сравнение и обмен операндов.

cmpxchg8b – сравнение и обмен 8-битовых операндов.

cpuid – идентификация процессора

cwde – преобразование слова в двойное слово с расширением.

enter – создание кадра стека для параметров процедур.

imul reg,imm – умножение операнда со знаком на непосредственное значе­ние.

ins/outs – ввод/вывод из порта в строку.

iretd – возврат из прерывания в 32-разрядном режиме.

j(cc) – команды условного перехода, допускающие 32-битовое смещение.

leave – выход из процедуры с удалением кадра стека, созданного командой enter.

lss/lfs/lgs – команды загрузки сегментных регистров.

mov DRx,reg; reg,DRx

mov CRx,reg; reg,CRx

mov TRx,reg; reg,TRx– команды обмена данными со специальными регист­рами. В качестве источника или приемника могут быть использованы регистры CR0...CR3, DR0...DR7, TR3...TR5.

movsx/movzx – знаковое/беззнаковое расширение до размера приемника и пересылка.

рора – извлечение из стека всех 16-разрядных регистров общего назначения (АХ, ВХ, СХ, DX, SP, ВР, SI, DI).

popad – извлечение из стека всех 32-разрядных регистров общего назначения (ЕАХ, ЕВХ, ЕСХ, EDX, ESP, EBP, ESI, EDI).

push imm – запись в стек непосредственного операнда размером байт, слово или двойное слово (например, push OFFFFFFFFh).

pusha – запись в стек всех 16-разрядных регистров общего назначения (АХ, ВХ, СХ, DX, SP, ВР, SI, DI).

pushad – запись в стек всех 32-разрядных регистров общего назначения (ЕАХ, ЕВХ, ЕСХ, EDX, ESP, EBP, ESI, EDI).

rcr/rcl/ror/rol reg/mem,imm – циклический сдвиг на непосредственное значе­ние.

sar/sal/shr/shl reg/mem,imm – арифметический сдвиг на непосредственное зна­чение.

scasd – сканирование строки двойных слов с целью сравнения.

set(cc) – установка байта по условию.

shrd/shld – логический сдвиг с двойной точностью.

stosd – запись двойного слова с строку.

xadd – обмен и сложение.

xlatb – табличная трансляция.

Команды защищенного режима

arpl – корректировка поля RPL селектора

clts – сброс флага переключения задач в регистре CR0.

lar – загрузка байта разрешения доступа.

lgdt – загрузка регистра таблицы глобальных дескрипторов.

lidt – загрузка регистра таблицы дескрипторов прерываний.

lldt – загрузка регистра таблицы локальных дескрипторов.

lmsw – загрузка слова состояния машины.

lsl – загрузка границы сегмента.

ltr – загрузка регистра задачи.

rdmsr – чтение особого регистра модели.

sgdt – сохранение регистра таблицы глобальных дескрипторов.

sidt – сохранение регистра таблицы дескрипторов прерываний.

sldt – сохранение регистра таблицы локальных дескрипторов.

smsw – сохранение слова состояния.

ssl – сохранение границы сегмента

str – сохранение регистра задачи.

verr – проверка доступности сегмента для чтения.

verw – проверка доступности сегмента для записи.


1.2 Первое знакомство с защищенным режимом

Как уже отмечалось, современные процессоры могут работать в трех режи­мах: реальном, защищенном и виртуального 86-го процессора. В реальном режи­ме процессоры функционируют фактически так же, как МП 8086 с повышенным быстродействием и расширенным набором команд. Многие весьма привлека­тельные возможности процессоров принципиально не реализуются в реальном режиме, который введен лишь для обеспечения совместимости с предыдущими моделями. Все программы, приведенные в предыдущих пособиях по системному программному обеспечению, относятся к реальному режиму и могут с равным успехом выполняться на любом из этих процессоров без каких-либо изменений. Характерной особенно­стью реального режима является ограничение объема адресуемой оперативной памяти величиной 1 Мбайт.

Только перевод микропроцессора в защищенный режим позволяет полно­стью реализовать все возможности, заложенные в его архитектуру и недоступные в реальном режиме. Сюда можно отнести:

- увеличение адресуемого пространства до 4 Гбайт;

- возможность работы в виртуальном адресном пространстве, превышаю­щем максимально возможный объем физической памяти и достигающей огром­ной величины 64 Тбайт. Правда, для реализации виртуального режима необходи­мы, помимо дисков большой емкости, еще и соответствующая операционная сис­тема, которая хранит все сегменты выполняемых программ в большом дисковом пространстве, автоматически загружая в оперативную память те или иные сег­менты по мере необходимости;

- организация многозадачного режима с параллельным выполнением не­скольких программ (процессов). Собственно говоря, многозадачный режим орга­низует многозадачная операционная система, однако микропроцессор предостав­ляет необходимый для этого режима мощный и надежный механизм защиты за­дач друг от друга с помощью четырехуровневой системы привилегий;

- страничная организация памяти, повышающая уровень защиты задач друг от друга и эффективность их выполнения.

При включении процессора в нем автоматически устанавливается реальный режим. Переход в защищенный режим осуществляется программно пу­тем выполнения соответствующей последовательности команд. Поскольку мно­гие детали функционирования процессора в реальном и защищенном режимах существенно различаются, программы, предназначенные для защищенного ре­жима, должны быть написаны особым образом. Реальный и защищенный режи­мы не совместимы! Архитектура современного микропроцессора необычайно сложна. Столь же сложными оказываются и программы, использующие средства защищенного ре­жима. К счастью, однако, отдельные архитектурные особенности защищенного режима оказываются в достаточной степени замкнутыми и не зависящими друг от друга. Так, при работе в однозадачном режиме отпадает необходимость в изу­чении многообразных и замысловатых методов взаимодействия задач. Во многих случаях можно отключить (или, точнее, не включать) механизм страничной орга­низации памяти. Часто нет необходимости использовать уровни привилегий. Все эти ограничения существенно упрощают освоение защищенного режима

Начнем изучение защищенного режима с рассмотрения простейшей (но, к сожалению, все же весьма сложной) программы, которая, будучи запущена обычным образом под управлением MS-DOS, переключает процессор в защи­щенный режим, выводит на экран для контроля несколько символов, переходит назад в реальный режим и завершается стандартным для DOS образом [8]. Рассматривая эту программу, мы познакомимся с основополагающей особенностью за­щищенного режима – сегментной адресацией памяти, которая осуществляется совсем не так, как в реальном режиме.

Следует заметить, что для выполнения рассмотренной ниже программы необ­ходимо, чтобы на компьютере была установлена система MS-DOS "в чистом виде" (не в виде сеанса DOS системы Windows). Перед запуском программ за­щищенного режима следует выгрузить как систему Windows, так и драйверы об­служивания расширенной памяти HIMEM.SYS и EMM386.EXE.

Листинг 1.1 – Программа, работающая в защищенном режиме

1;*********************************************

2; Программа, работающая в защищенном режиме *

3;*********************************************


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: