Память
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-разрядным. Так что теперь вы можете забыть о сегментных регистрах и сосредоточиться на других регистрах.
[наверх]