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).