Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КОНСПЕКТ ЛЕКЦИЙ ПО АССЕМБЛЕРУ.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
471.55 Кб
Скачать

Сегментация памяти

Первая PC имела 16 бит адреса. В дальнейшем в модели IBM PC XT разрядность шины адреса (ША) стала 20 бит, что привело к идее сегментации памяти.

Процессор рассматривает память как группу сегментов. Сегмент представляет собой единицу размером 64К. Это вызвано тем, что регистры микропроцессора 16-тиразрядные, 2^16=65536=64К. Все исполняемые программы используют один или более сегментов. Сегменты различаются по назначению: сегмент данных, сегмент стека и сегмент команд.

Сегменты располагаются в памяти с адресов кратных 16, шестнадцатеричный адрес сегмента содержит 0 в младшей тетраде. Например: 0Е840, 5FF40. В связи с этим младшая цифра адреса не записывается и считается, что адрес сегмента задается в параграфах: 0Е84 и 5FF4. Параграф – это шестнадцать байт ОЗУ, расположенные последовательно с адреса кратного шестнадцати. Такая адресация сегментов позволила 20-тиразрядный адрес располагать в 16-тиразрядном регистре процессора.

Если бы программе выделялись сегменты размером 64К, то для любой EXE-программы требовалось бы 3 сегмента (минимум 192К). Однако программные сегменты имеют минимально допустимые размеры. Например, на рис. показано расположение в памяти небольшой EXE-программы. Сегмент стека занимает 64 байт. Это – минимальный рекомендуемый объем, который требуется для сегмента стека. Для отладки программы мы будем использовать программу td.exe, которая использует память сегмента стека. Вслед за ним располагается сегмент данных, который занимает 14 байт. Сегмент кода (программы) располагается через 2 байта за сегментом данных. Два байта пропущены, так как адрес любого сегмента кратен 16. Сегмент кода занимает 37 байт или 3 параграфа. В итоге программа занимает 8 параграфов памяти. Такая модель программы в языке Си называется компактной (compact) и позволяет создавать программы с минимальным размером памяти.

0437Fh┌───────┐

04380h├───────┤ ──┐

├───────┤ │

│ | │ │ CЕГМЕНТ СТЕКА

043BFh├───────┤ │ >=64БАЙТА

043C0h├───────┤ ──┤

├───────┤ │ CЕГМЕНТ ДАННЫХ

│ | │ │ 14 БАЙТ.

043CDh├───────┤ │

043CEh├───────┤ ──┤

043CFh├───────┤ │ НЕИСПОЛЬЗУЕМЫЕ БАЙТЫ ПАМЯТИ

043D0h├───────┤ ──┤

├───────┤ │

│ | │ │ СEГМЕНТ ПРОГРАММЫ

043F5h├───────┤ │ 25H=37БАЙТ

043F6h├───────┤ ──┘

└───────┘

Логические и физические адреса памяти

Физический адрес представляет собой 20-ти битовое значение, которое выставляется на шину адреса (ША) при обращении к памяти. Диапазон адресов 0h..0FFFFFh -адресное пространство 1 МБ. В ассемблере шестнадцатеричные константы заканчиваются буквой h. Если первая шестнадцатеричная цифра задана одной из следующих букв A, B, C, D, E, F, то впереди добавляется цифра 0 (ноль).

Логический адрес состоит из двух 16-ти битовых беззнаковых значений: базового (начального) адреса сегмента и смещения адреса ячейки внутри сегмента. Диапазон значений смещения 0h..0FFFFh, то есть позволяет адресовать любой байт 64К сегмента. Смещение адреса относительно начала сегмента будем называть эффективным или исполнительным адресом (ЕА), так как на программном уровне можно не рассматривать аппаратное вычисление физического адреса.

Для хранения адресов сегментов в процессоре предусмотрены 4 сегментных регистра (адреса даны для предыдущего примера):

CS – code segment 043D0h

DS – data segment 043C0h

SS – stack segment 04380h

ES – сегмент расширения (используется, например, в некоторых операциях со строками).

Сегментные регистры – 16-ти разрядные.

В процессе выполнения программы в сегментные регистры загружены адреса «текущих» сегментов. Большие EXE-программы могут использовать несколько сегментов данных и сегментов кодов. В определенный момент производится выборка команды из текущего сегмента кода, и команда обрабатывает данные из текущего сегмента данных.

┌───────┐

┌───────────────────┤ 043Ch │ <- DS

V └───────┘

┌─────────┐─────────┐

0h-1h │ A1 - СЛОВО │

├─────────┤─────────┘

2h │ В1-БАЙТ │

├─────────┤─────────┐

3h-4h │ A2 - СЛОВО │

├─────────┤─────────┤

5h-6h │ A3 - СЛОВО │

├─────────┤─────────┤

7h-8h │ A4 - СЛОВО │

└─────────┘─────────┘

Логический адрес переменных, расположенных в сегменте данных,будем записывать в виде DS:OFFSET.

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

сегмент| |смещение

16 \ \ 16

| |

v v

┌───┴──┐ ┌─┴────┐

└┐ └─┘ ┌┘

└┐СУМ.АДРЕСОВ┌┘

└─────┬─────┘

└───/────>ША <- Физический адрес

20

Перед сложением адрес сегмента дополняется справа нулевой тетрадой.

1) Физический адрес переменной B1:

– адрес сегмента

– адрес смещения

– физический адрес

2) Физический адрес переменной A4:

– адрес сегмента

– адрес смещения

– физический адрес