Вход/Регистрация
Ассемблер для процессоров Intel Pentium
вернуться

Магда Юрий

Шрифт:
 


Рис. 3.9. Линейная модель памяти


– сегментированная модель памяти (segmented memory model) – память состоит из трех отдельных пространств адресов, которые называются сегментами. При этом программный код, данные и стек размещаются в отдельных сегментах памяти. Для того чтобы обратиться к байту в памяти, программа формирует логический адрес, состоящий из адреса сегмента (селектора сегмента) и смещения. Программы, выполняющиеся в 32-разрядном режиме, могут использовать до 16 383 сегментов разного размера, каждый из которых может иметь размер 232 байт. Схема адресации для сегментированной модели памяти показана на рис. 3.10.



Рис. 3.10. Сегментированная модель памяти


Механизм преобразования адресов при использовании сегментированной модели таков: вначале все адреса сегментов, определенных в программе, отображаются на общее линейное пространство адресов, доступное процессору. Затем логический адрес операнда в памяти преобразуется в линейный адрес из пространства адресов. Все эти преобразования прозрачны для работающей программы. Подобная модель позволяет повысить надежность работы программ. Например, если разместить программный код и область стека в разных сегментах, то в случае резкого увеличения размера стека не произойдет перекрытия программного кода данными из стека;

– модель реального режима адресации (real-address mode memory model) – это модель памяти, используемая в процессорах 8086. Данная модель памяти поддерживается для того, чтобы обеспечить совместимость с ранее разработанными 16-разрядными приложениями. В этой модели применяется механизм сегментации, причем максимальный размер сегмента не превышает 64 Кбайт. Максимальный размер линейного адресного пространства, доступного в этом режиме, равен 220 байт.

При разработке 32-разрядных программ на языке ассемблера обычно используется линейная, или плоская, модель памяти. Все примеры 32-разрядных процедур, приведенные в этой и последующих главах, разработаны с использованием этой модели. При 32-разрядной адресации операндов логический адрес состоит из 16-разрядного селектора сегмента и 32-разрядного смещения. При 16-разрядной адресации логический адрес состоит из 16-разрядного селектора сегмента и 16-разрядного смещения.

При выполнении любой программы процессор обращается к памяти, в которой хранятся команды и данные. Для доступа к данным необходимо каким-то образом определять их адрес в памяти. Способ формирования адреса операнда или метки перехода на другую команду называется режимом адресации, или адресацией.

Инструкции ассемблера включают самые разнообразные команды, работающие как с операндами, так и без них. Некоторые команды требуют явного указания операндов, в то время как другие используют операнды по умолчанию. Данные операнда-источника могут находиться в регистре, памяти, в порту ввода-вывода или задаваться непосредственно в инструкции. Операнд-приемник может располагаться в оперативной памяти, в регистре или быть портом ввода-вывода.

Для четкого понимания того, как осуществляется адресация данных, проанализируем способ образования адреса операнда. Адрес операнда формируется по схеме сегментхмещение. В зависимости от используемой модели памяти адрес переменной в памяти может формироваться как 16 : 16 или 16 : 32. Смещение операнда называется его эффективным или исполнительным адресом (Effective Address, EA).

Селектор сегмента можно указать явным или неявным образом. Обычно селектор сегмента загружается в сегментный регистр, а сам регистр выбирается в зависимости от типа выполняемой операции, как показано в табл. 3.2.


Таблица 3.2. Критерии выбора сегментного регистра



Процессор автоматически выбирает сегмент в соответствии с условиями, описанными в табл. 3.2. При сохранении операнда в памяти или загрузке из памяти в качестве сегментного регистра по умолчанию используется DS, но можно и явным образом указать сегментный регистр, применяемый в операции.

Пусть, например, требуется сохранить содержимое регистра ЕАХ в памяти, адресуемой сегментным регистром ES и смещением, находящимся в регистре ЕВХ. В этом случае можно использовать команду

mov ES:[ЕВХ]. ЕАХ

Обратите внимание на то, что после имени сегмента указывается символ двоеточия.

На уровне процессора замена сегмента задается специальным префиксом замены, который является однобайтовым числом, располагающимся перед кодом команды. В некоторых случаях замена сегмента не допускается:

– для сегмента программного кода – все команды используют исключительно сегментный регистр CS;

– при выполнении строковых операций строка-приемник адресуется только регистром ES;

– операции помещения в стек и извлечения из стека всегда используют регистр SS.

Некоторые инструкции процессора требуют явной инициализации сегментных регистров. В таких случаях селектор сегмента может быть извлечен из 16-разрядного регистра или переменной в памяти, как, например, в следующей команде:

mov DS. BX

Здесь селектор сегмента, находящийся в регистре ВХ, помещается в сегментный регистр DS. В некоторых случаях селектор сегмента может определяться через 48-разрядный указатель, находящийся в памяти. При этом младшее двойное слово содержит 32-разрядное смещение, а старшее слово – 16-разрядный селектор сегмента.

  • Читать дальше
  • 1
  • ...
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: