Предыдущий раздел ВЫПОЛНЕНИЕ ПРОГРАММ ПРОЦЕССОРОМ I8086 Следующий раздел

2.3. Адресация памяти

Применение сегментных регистров процессора i8086 вызвано стремлением расширить объем программно адресуемого пространства ОП. Дело в том, что 20-проводная шина адреса (входит в состав ОШ, см. рис. 7) позволяет адресовать до 1 млн. ячеек (байтов) ОП, так как 220 » 1 млн. Но все регистры в рассматриваемом ЦП 16-битные. Ни одного 20-битного нет. Максимальный объем памяти, который можно адресовать с помощью 16 бит, составляет 64К (1К = 1024).  Рассмотрим, как получаются 20-битные адреса.

Мысленно разобьем ОП на участки по 16 байт, называемые параграфами (рис. 9). Регистр сегмента кода CS содержит номер параграфа, с которого начинается выделенный нашей программе сегмент. Например, это может быть число 0002h. Для получения реального адреса начальной ячейки параграфа необходимо его номер (0002h) умножить на число 16: 0002h х 10h = 00020h.

 


   Рис. 9.  Разбиение ОП на параграфы

 

Указатель команды IP содержит относительный адрес (смещение) адресуемой ячейки относительно начала сегмента. Допустим, что это число 100h. Физический адрес R адресуемой ячейки ЦП получает непосредственно перед обращением к ОП путем суммирования содержимого регистра CS,  умноженного на 16 (10h), с содержимым регистра IP:

   R = (CS) x 10h + (IP),

где запись регистра в круглых скобках означает содержимое этого регистра. Например, пусть (CS) = 0002h, а (IP) = 0100h, тогда R = 2h x 10h + 100h = 120h  (рис.10).

В пределах текущего сегмента IP может обращаться к любой ячейке ОП, имеющей смещение относительно начала сегмента 0 ¸216 – 1, т.е. 0 ¸ 65535. Число 216 = 65536 = 10000h = 64K называется длиной сегмента.

 

Рис.10. Получение физического адреса

 

Имея в своем распоряжении четыре сегментных регистра, программа (а точнее, выполняющий ее ЦП) использует их по-разному: CS – для адресации машинных команд, SS – для адресации ячеек стека, DS – для основной адресации данных, ES – для дополнительной адресации данных. Поэтому в любой момент времени любая машинная программа имеет в своем распоряжении четыре логических сегмента ОП размером 64K. Каждый из этих логических сегментов играет строго определенную роль при выполнении команд машинной программы:

1. сегмент кода – сегмент ОП, номер начального параграфа которого находится в регистре CS. Следующая команда программы выбирается только из сегмента кода;

2. сегмент данных – сегмент ОП, номер начального параграфа которого – в регистре DS. Команды, у которых ячейки памяти задаются только одним операндом, имеют дело с этим сегментом данных;

3. дополнительный сегмент данных – сегмент ОП, номер начального параграфа которого – в регистре ES. Команды, у которых ячейки памяти задаются обоими операндами, используют и сегмент данных, и дополнительный сегмент данных;

4. сегмент стека – сегмент ОП, номер начального параграфа которого – в регистре SS. Команды, выполняющие операции со стеком, имеют дело с тем стеком, на который “указывает” SS.

Перечисленные логические сегменты как бы «высвечиваются» ЦП из одно-мегабайтового адресного пространства ОП. Причем они могут пересекаться друг с другом или вообще совпадать. Выполняя запись в сегментные регистры (например, с помощью команды mov) нового содержимого, программа выполняет замену «высвечиваемых» сегментов.

Для того чтобы можно было обращаться к любой ячейке логического сегмента, в распоряжении программы имеется регистр, содержащий смещение искомой ячейки относительно начала сегмента. Это:

1) для сегмента кода – IP;

2) для сегмента данных – BX, SI, DI;

3) для дополнительного сегмента данных – BX, DI;

4) для сегмента стека – SP.

Таким образом, логический адрес любой ячейки ОП представляет собой пару:

     (S, L) = ((регистр сегмента), (регистр смещения)),

где S – начальный адрес сегмента (номер параграфа);

 L – смещение ячейки относительно начала сегмента.

Далее будем называть S адресом-сегментом, а Lадресом-смещением.

Преобразование логического адреса в физический происходит при попадании соответствующей машинной команды на ЦП так, как это показано на рис.10. Так как это преобразование происходит во время выполнения программы, то оно называется динамическим преобразованием адреса. (Статическая операция производится до начала выполнения программы.) 

 


Предыдущий раздел В начало Следующий раздел