Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
01юьб тж.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.62 Mб
Скачать

Адресация памяти

Как было уже сказано выше, каждому байту соответствует свой уникальный адрес, называ­емый физическим.

Диапазон значений физических адресов зависит от разряднос­ти шины адреса процессора. Процессор 8086 имел 20-разрядную шину адреса и мог получить доступ лишь к 1 Мбайт памяти − от 0 до 220–1. Для i486 и Pentium он находится в пределах от 0 до 232–1, т.е. 4 Гбайт. Для процессоров Pentium Pro/II/III/IV этот диапазон шире − от 0 до 236–1, т.е. 64 Гбайт. Современные процессоры имеют 64-разрядную шину адреса.

Все процессоры эмулируют режим процессора 8086, исходя из этого, а также для упрощения мы будем рассматривать методы представления адреса 20 битами. Первый байт в этом случае имеет адрес 0, последний имеет адрес 1048575 или FFFF в шестнадцатеричной системе счисления.

И

Рис. 6. Сегментация памяти

мея 20-разрядную шину адреса, процессор 8086 использует только 16-разрядные регистры. С помощью 16 разрядов можно представить значение от 0 до 65535 (216) или округленно 64 Кбайт (рис. 6). Чтобы охватить все адресное пространство в 1 Мбайт, последнее делят на логические фрагменты по 64 Кбайт. С помощью этого метода адрес конкретного байта может быть выражен двумя значениями: адресом фрагмента (сегмента) и смещением (offset) от начала сегмента.

Д

Рис. 7. Создание 20-битового физического адреса

ля создания 20-битового физического адреса процессор объединяет значение одного сегментного регистра с 16-битовым смещением (рис. 7). Это делается путем четырехкратного сдвига битов влево и прибавлением к результату смещения:

Значения начала сегмента и смещения пишут в шестнадцатеричной системе счисления и через двоеточие, например, 0040:0201. Представленный в таком виде адрес называется логическим.

Чтобы от логического адреса перейти к физическому, требуется преобразовать 0040 и 0201 в двоичную систему счисления, сдвинуть значения начала сегмента (0040) на 4 разряда и прибавить к нему значение смещения. Полученное значение перевести обратно в шестнадцатеричную систему счисления. Тот же результат, но без перевода в двоичную систему, можно получить, если сместить 0040 на 1 разряд влево (получится 0400) и прибавить к нему 0201. И в первом, и втором случае получим значение 0601h.

Запуск программы

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

Если программа имеет маленький код и для ее данных требуется мало место (такие программы обычно создают с расширением com), то и код, и данные помещаются в один сегмент размером 64 Кбайт. В случае, если программа имеет больший объем, под ее код и данные отводится различные сегменты размером до 64 Кбайт. Такие программы создают с расширением exe. Далее мы будем создавать именно exe-программы.

Кроме сегментов данных и кода создаются еще сегменты для стека (его рассмотрим в следующей лабораторной работе) и дополнительный сегмент, не зависимо от того, намерен пользователь обращаться к ним или нет.

Чтобы процессор знал, где находятся код, данные и стек программы, используются сегментные регистры:

    • регистр сегмента cs кода указывает на начало сегмента кода;

    • регистр сегмента данных ds указывает на начало сегмента данных;

    • регистр сегмента ss стека указывает на начало сегмента стека;

    • дополнительный сегментный регистр es является вспомогательным и при запуске программы указывает на начало сегмента данных, но может указывать и на дополнительный четвертый сегмент.

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

Для обращения к конкретной команде, хранящейся, как и остальные, в одном сегменте, необходимо знать не только адрес начала сегмента кода, но и значение смещения относительно этого сегмента. Это смещение хранится в командном указателе ip − также строго специализированном. После запуска программы пара регистров cs и ip (пишется cs:ip) указывают на адрес первой команды: cs − на начало сегмента, ip − на смещение (рис. 8).

Рис. 8. Сегментные регистры

Для обращения к конкретной области памяти из сегмента данных используют регистры si и di, а также регистры dx и bx. Работу с этими регистрами рассмотрим позже.

Для работы со стеком аналогичным образом используются регистры sp и bp.