Win32asm обучение

  d8ef8794     

Память


     Win32Asm Tutorial     
назад4 - Память вперед

4.0 - Память

Этот раздел объяснит, как устроена память в windows.

4.1 - DOS & win 3.xx

В 16-разрядных программах, как и в DOS, и в windows 3, память была разделена на сегменты. Эти сегменты имели размер 64kb. Для доступа к памяти были необходимы: указатель на сегмент и указатель смещения. Указатель сегмента указывал, какой сегмент (секцию 64kb) использовать, указатель смещения указывал непосредственно на место в сегменте. Смотрите рисунок:

Память
Сегмент 1 (64kb) Сегмент 2 (64kb) Сегмент 3 (64kb) Сегмент 4(64kb) и так далее

Учтите, что это объяснение для 16-разрядных программ, о 32-разрядных я расскажу позже, (но не пропускайте эту часть, важно понять, что такое 32-разрядность).
Таблица выше иллюстрирует общую память, разделенную на сегменты по 64kb. Здесь максимум 65536 сегментов. Теперь возмите один из сегментов:

Сегмент 1(64kb)
Смещение 1Смещение 2Смещение 3Смещение 4Смещение 5и так далее

Чтобы указать на местоположение в сегменте используется смещение. Смещение - это местоположение внутри сегмента. Здесь в сегменте максимум 65536 смещений. Запись адреса в памяти:

СЕГМЕНТ:СМЕЩЕНИЕ (SEGMENT:OFFSET)

Например:

0030:4012

(все числа шестнадцатиричные)

Это означает: сегмент 30, смещение 4012. Чтобы узнать, что находится в том адресе, вы сначала переходите на сегмент 30, а затем в сегменте смещаетесь на 4012. В предыдущих уроках мы узнали о сегментных и указательных регистрах. Например, сегментные регистры:

CS - Сегмент кода
DS - Сегмент данных
SS - Сегмент стека
ES - Дополнительный сегмент
FS - Универсальный сегмент
GS - Универсальный сегмент

Названия говорят о их функциях: сегмент кода (CS) содержит номер секции, где вылнен текущий код. Сегмент данных для получения данных из текущего сегмента. На стек указывает сегмент стека (SS) (подробнее о стеке я раскажу позже), ES, FS, GS - универсальные регистры и могут использоваться для любого сегмента (не в win32).


Регистры указателя большую часть времени содержат смещение, но и универсальные регистры (ax, bx, cx, dx и т.д.) также могут использоваться для этого. IP указывает смещение (в регистре CS (сегмент кода)) команды, которая в настоящее время выполнена. SP содержит смещение (в регистре SS (сегмент стека)) текущей позиции стека.
4.2 - 32-разрядный Windows
В 16-разрядном программировании, сегменты необходимы. К счастью, эта проблема решена в 32-разрядном Windows (95 и выше). Вы все еще имеете сегменты, но вам не нужно заботиться о них, потому, что они уже не 64kb (как в 16-разрядном), а 4 Гб. Windows вероятно даже "повиснет", если вы попытаетесь изменить один из сегментных регистров. Это называеся плоской моделью памяти (flat). Здесь есть только смещения и они теперь 32-разрядные (в диапазоне от 0 до 4,294,967,295). Каждая ячейка в памяти указывается смещением. Это действительно одно из лучших преимуществ 32-разрядного программирования над 16-разрядным. Так что теперь вы можете забыть о сегментных регистрах и сосредоточиться на других регистрах.
[наверх]

Содержание раздела