Эта глава об`ясняет адресацию памяти в совместимым с
8086/8088 реальном режиме и в совместным с 8086/8088
виртуальным 8086 режиме. Так как оба режима являются
8086/8088-совместимыми, режимы адресации, доступные при
16-битном программировании, идентичны в обоих режимах.
Единственной разницей между реальным и виртуальном 8086
режимами является доступность постраничной организации в
виртуальном 8086 режиме. Однако, страничная организация обычно
контролируется 32-битной основной программой и является
прозрачной для 16-битных программ.
Эта глава фокусирует внимание на 16-битных режимах
адресации. В этих режимах исполнительный адрес вычисляется как
сумма трех компонентов 16-битного адреса: базы, смещения и
индекса. Поэтому исполнительный адрес также является 16-битной
величиной.
Исполнительный адрес рассматривается как смещение от базы
текущего сегмента памяти. Поэтому, второй шаг при любом
16-битном режиме адресации состоит в прибавлении базы сегмента
к исполнительному адресу. Адрес базы сегмента - это значение
селектора, умноженное на 16, или, как показывают рис. 4.1 и
4.2, значение селектора, сдвинутое на четыре позиции влево.
Таким образом, адрес базы сегмента является 20-битной
величиной, и линейный адрес также становится 20-битной
величиной.
16-битные режимы работы обеспечивают пространство линейных
адресов в 2 в 20 степени байт, другими словами, один мегабайт
памяти. Это прямой результат 16-битных режимов адресации,
которые, благодаря 4-битному сдвигу адреса базы сегмента,
генерирует 20-битный линейный адрес.
Вожможны различные комбинации компонентов 16-битного
адреса, использующие подмножества доступных компонент. Простые
режимы используют только один компонент, а более сложные
используют больше.
Большинство режимов адресации является регистровыми
режимами непрямой адресации. Они применимы к адресации данных
и программ. 80386 представляет также режимы непрямой адресации
памяти, они, однако, применимы только к адресации программ. На
последующих страницах описаны и проиллюстрированы все
16-битные режимы адресации. Обратите внимание, что эти примеры
тщательно демонстрируют модуль выполняемого сложения, чтобы
показать, поддерживается или теряется перенос сложения.
В виртуальном 8086 режиме 80386 предлагает встроенную
поддержку виртуальной памяти посредством страничной
организации. Страничная организация, если она позволена, - это
процесс перевода, выполняемый над линейным адресом перед
доступом к памяти. Шестнадцатибитная адресация, включая
страничную организацию, проиллюстрирована на рис 4.2 и
применена к виртуальному 8086 режиму. В реальном режиме
страничная организация не допускается.
Страничная трансляция преобразует 32-битный линейный адрес
- расширенную форму 20-битного линейного адреса. Как
показывает рис. 4.2, трансляция страницы приводит к замене
верхних 20 битов исполнительного адреса на другую 20-битную
величину. Смещение является функцией оригинальной 20-битной
величины, использующей таблицу страниц - резидент в памяти.
Этот раздел рассматривает страничную организацию, так как она
связана со всем процессом перевода адреса. Но это просто
введение в страничную организацию, которая будет описана в
главе 3. Оставшаяся часть этой главы описывает формирование
16-битного адреса.
Прямые регистровые режимы требуют, чтобы операнд находился в
одном из восьми общих регистров, одном из шести об`ектных
регистров или в одном из системных регистров.
Операнд находится в общем регистре, специфицированном в поле
R/M. Использованный размер регистра может быть 8,16 и 32 бита,
в зависимости от размера операнда данных команды.
Операнд находится в сегментном регистре,специфицированном в
поле регистра. Обратите внимание, что этот режим адресации не
использует байт MOD R/M. Вместо этого он использует поле SREG
команды, из которого загружаются или в который запоминаются
сегментные регистры.
Непосредственная адресация подразумевает, что операнд
содержится в самой команде. Режим непосредственной адресации
может специфицировать только операнд источника, но не операнд
назначения. Непосредственный операнд может быть байтом или
словом. Режим непосредственной адресации не определяется
байтом MOD R/M; вместо этого некоторые коды команд неявно
определяют использование непосредственной адресации для
операнда источника. Те же команды могут однако включать байт
MOD R/M для определения операнда назначения.
Эти режимы адресации определяет то, что операнд находится в
сегменте памяти и содержимое одного или нескольких регистров
используется для вычисления исполнительного адреса внутри
сегмента. Затем прибавляется адрес базы сегмента, что
формирует 20-битный линейный адрес операнда.
Регистры SI,DI,BX или BP могут служить базовым регистром,
содержащим адрес операнда памяти.
Регистры SI,DI,BX или BP могут служить базовым регистром,
содержащим адрес, который прибавляется к смещению,
расширенному знаком. Затем прибавляется адрес сегмента базы,
что формирует 20-битный линейный адрес операнда.
Пары регистров BX+SI, BX+DI, BP+SI и BP+DI могут каждая
служить в качестве базового и индексного регистров, которые
складываются для формирования исполнительного адреса операнда
памяти. Затем, для формирования 20-битного линейного адреса,
добавляется адрес базы сегмента.
Пары регистров BX+SI, BX+DI, BP+SI и BP+DI могут каждая
служить в качестве базового и индексного регистров, которые
складываются со смещением, расширенному знаком. Сумма
формирует исполнительный адрес операнда памяти. Затем, для
формирования 20-битного линейного адреса, добавляется адрес
базы сегмента.
Исполнительный адрес определяется как абсолютный 16-битный
сдвиг от базы сегмента. Значение смещения задается в самой
команде.
Для команд PUSH, PUSHA, CALL и INT n, регистр SP содержит
адрес операнда памяти. Перед использованием регистра SP он
уменьшается на размер операнда данных, который вталкивается в
стек.
Для команд POP, POPA, RET и IRET регистр SP содержит адрес
операнда памяти. После использования регистр увеличивается на
размер операнда данных, который только что был вытолкнут из
стека.
Соответствующие формы команд JMP и CALL используют непрямую
адресацию. Режимы непрямой адресации предлагают всю гибкость
регистровых непрямых режимов, которые описаны в предыдущем
разделе.
Для команд JMP и CALL внутри кодового сегмента непрямая
адресация памяти работает следующим образом: для генерации
16-битного смещения суммируются компоненты адреса, а затем,
для формирования двадцатибитного линейного адреса,
прибавляется адрес базы сегмента. Этот участок памяти содержит
16-битный исполнительный адрес команды назначения внутри
текущего кодового сегмента.
Для команд JMP и CALL, вызывающих другой кодовый сегмент,
непрямая адресация памяти работает следующим образом: для
генерации 16-битного смещения суммируются компоненты адреса, а
затем, для формирования 20-битного линейного адреса,
прибавляется адрес базы сегмента. Этот участок памяти содержит
полный адрес (16-битный исполнительный адрес команды
назначения и 16-битный селектор кодового сегмента назначения).
Все 32 бита полного адреса загружаются и используются для
выборки программы назначения.
Большинство команд задают местоположение операнда байтом MOD
R/M. Для большинства команд байт MOD R/M полностью определяет
режим адресации, использованный для операнда источника и
операнда назначения. Либо операнд источника либо операнд
назначения является общим регистром. Второй операнд может быть
общим регистром или адресом памяти. Если второй операнд
является адресом памяти, это определяет режим адресации. Чтобы
определить оба операнда, байт MOD R/M содержит три поля.
Байт MOD R/M следует за байтом (байтами) кода команды
80386, как показано на рис. 4.3. Байт MOD R/M делится на три
поля, показанные на рисунке. Трехбайтное поле REG определяет
регистровый операнд. Двубитное поле MOD определяет является ли
второй операнд также регистровым; если является, то 3-битное
поле R/M определяет другой регистровый операнд. Если, с другой
стороны, поле MOD показывает, что операнд находится в памяти,
то поля MOD и R/M вместе определяют использованный режим
адресации.
Содержание
Вперед