Ассемблер Это просто! Учимся программировать


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


Возьмем следующее предложение: "Изучаем сегменты памяти". Теперь давайте посчитаем, на каком месте стоит буква "ы" в слове "сегменты" от начала предложения, включая пробелы... На шестнадцатом. Подчеркну, что мы считали от начала предложения.

Теперь немного усложним задачу и разобьем предложение следующим образом (символом "_" обозначен пробел):

Пример № 1:

0000: Изучаем_

0010: сегменты_

0020: памяти

0030:

В слове "Изучаем" символ "И" стоит на нулевом месте; символ "з" на первом, "у" на втором и т.д. В данном случае мы считаем буквы начиная с нулевой позиции, используя два числа. Назовем их сегмент и смещение. Тогда, символ "ч" будет иметь следующий адрес: 0000:0003, т.е. сегмент 0000, смещение 0003. Проверьте...

В слове "сегменты" будем считать буквы начиная с десятого сегмента, но с нулевого смещения. Тогда символ "н" будет иметь следующий адрес: 0010:0005, т.е. пятый символ начиная с десятой позиции: 0010 - сегмент, 0005 - смещение. Тоже проверьте...

В слове "память" считаем буквы начиная с 0020 сегмента и также с нулевой позиции. Т.о. символ "а" будет иметь адрес 0020:0001, т.е. сегмент - 0020, смещение - 0001. Опять проверим...

Итак, мы выяснили, что для того, чтобы найти адрес нужного символа, необходимы два числа: сегмент и смещение внутри этого сегмента. В Ассемблере сегменты хранятся в сегментных регистрах: CS, DS, ES, SS (), а смещения могут храниться в других (но не во всех). Не все так сложно, как кажется. Опять-таки, со временем Вы поймете принцип.

Регистр CS служит для хранения сегмента кода программы (Code Segment - сегмент кода);

Регистр DS - для хранения сегмента данных (Data Segment - сегмент данных);

Регистр SS - для хранения сегмента стека (Stack Segment - сегмент стека);

Регистр ES - дополнительный сегментный регистр, который может хранить любой другой сегмент (например, сегмент видеобуфера).

Пример № 2:




Начало  Назад  Вперед



Книжный магазин