Обычная память (Conventional Memory). Сегменты оперативной памяти.
У микропроцессора Intel 386 шины адреса и данных стали 32-разрядными, а размер пространства адресов увеличился до 4 Гбайт. Кроме того, был введен еще один виртуальный режим (virtual-address mode), иногда его обозначают V86. Он позволяет при работе в защищенном режиме эмулировать процессор 8086. Отличие от реального режима в том, что адреса не являются физическими (реальными), а отображаются на конкретную часть 32-разрядного пространства. Это позволяет современным операционным системам "параллельно" выполнять несколько задач, рассчитанных на работу в реальном режиме, загружая их в свободные адреса ОЗУ.
Таким образом, работа любого современного IBM PC начинается в реальном режиме, затем его можно перевести в защищенный режим, а из последнего – в виртуальный. Изменение текущих режимов работы микропроцессора обычно выполняет операционная система. Прикладные задачи могут это делать только при работе в монопольном режиме, на практике такие случаи встречаются редко.
Сегменты оперативной памяти
В реальном режиме работы процессора пространство оперативной памяти делится на сегменты, размер которых не превышает 64 Кбайт, а адрес начала обязательно кратен 16.
При выборке команд и операндов микропроцессор вычисляет абсолютный адрес, исходя из значения (кода) сегмента и смещения (относительного адреса) в нем. Для этого он сдвигает значение сегмента на 4 разряда вправо и прибавляет смещение к результату сдвига. Табл. Б.1 иллюстрирует схему формирования 20-разрядного адреса.
Таблица Б.1. Схема формирования 20-разрядного адреса.
15 | 14 | 13 | … | c | м | е | щ | е | н | и | е | … | 2 | 1 | 0 | ||||
15 | 14 | 13 | 12 | … | с | е | г | м | е | н | т | … | 2 | 1 | 0 | ||||
19 | 18 | 17 | … | п | о | л | н | ы | й | а | д | р | е | с | … | 2 | 1 | 0 |
При записи на бумаге или на экране монитора сегмент и смещение разделяет символ "двоеточие". Например, записи 1111:2222 соответствует адрес 11110 + 2222 = 13332. Такая форма записи адресов используется при работе с большинством отладчиков.
Один и тот же полный адрес может быть задан различными способами. Например, область данных BIOS расположена в оперативной памяти, начиная с абсолютного адреса 400h. Его можно записать в виде 0000:0400, 0040:0000, 0020:0200 И Т. П.
Оперативная память занимает не все пространство адресов, а только младшие 640 Кбайт. Ее можно разделить на 10 сегментов максимального размера (64 Кбайт), коды которых будут изменяться от оооо до эоооь. Обычно далеко не все сегменты имеют максимальный размер, поэтому их количество бывает больше 10, но в любом случае сегмент с кодом AOOOh уже не относится к оперативной памяти, обычно это код видеосегмента при работе в графических режимах. И вообще, пространство от 640 Кбайт до 1 Мбайт выделено для размещения BIOS, ее дополнений, расположенных на платах контроллеров внешних устройств, адресов, через которые происходит доступ к этим устройствам, и т. п.
Расположение адресов в регистрах
Микропроцессор выбирает части адреса из двух разных регистров. Коды сегментов хранятся в специальных сегментных регистрах, которые предназначены только для этих целей. Начиная с модели 80386, у микропроцессоров Intel таких регистров 6. На языке ассемблера они имеют имена cs, DS, ES, FS, GS, ss. По умолчанию, т. е., если явно не указано другое, регистр cs используете т при выборке команд, DS – при выборке данных, a ss – при работе со стеком. Умолчаний для ES, FS и GS не существует, они всегда указываются явно.
Смещения в сегментах (относительные адреса) процессор может выбирать из шести регистров, которые на языке ассемблера имеют имена вх, ВР, IP, SP, DI, si. Первый (вх) называется регистром базы, относится к регистрам общего назначения и делится на два байта. Остальные пять на байты не делятся, три из них имеют фиксированное назначение. В SP хранится указатель стека, с ним работают команды push, pop и др. Регистр ВР используется для доступа обычных команд (mov, add и пр.) к области стека (см. приложение В). Из IP процессор выбирает относительный адрес очередной выполняемой команды. Индексные регистры DI и si используют строковые операции, а в остальных случаях они не имеют фиксированного назначения.