Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Тема 1.6 Сегментация и адресация

Поиск

Процессор может обращаться к одному или более байтам памяти. Под словом в процессоре понимается двухбайтовая ячейка памяти. Для уяснения вопроса о размещении данных в ОЗУ, рассмотрим десятичное число 1315, шестнадцатеричный эквивалент которого равен 0529Н. Это значение может быть помещено в слово в ОЗУ. Оно состоит из старшего байта, значение которого равно 05, и младшего байта со значением 29 (привыкайте, что значения в памяти отображаются в шестнадцатеричном виде). Процессор хранит данные в памяти в инверсном виде: младший байт – по младшему адресу, а старший – по старшему, на 1 больше предыдущего. Поскольку дамп памяти (отображение содержимого ячеек памяти) представляется отладчиками (TD, DEBUG) в порядке увеличения адресов байтов, интерпретировать значения слов или двойных слов надо справа налево. Например, значение 0529Н в памяти компьютера, начиная с адреса 04А26Н, будет храниться следующим образом: значение 29Н в байте с адресом 04А26Н, а 05 – 04А27Н. Нижеприведенный рисунок иллюстрирует размещение слова в памяти и в регистре.

При программировании на ассемблере надо ясно представлять себе разницу между адресом ячейки памяти и ее значением. В рассматриваемом нами примере ячейка, имеющая адрес 04А26, хранит значение 29, а ячейка с адресом 04А27 – 05. В описаниях работы и в алгоритмах обработки информации часто адрес называется указателем переменной, а содержимое указателя – значением переменной..

 

 

                     Младший байт           Старший байт

05
29
05
29
Регистр

 

 

Память

         

 

 

                              Адрес 04А26Н            Адрес 04А27Н

          Рисунок 4.2 Расположение байтов слова в памяти компьютера и в регистре

 

Сегменты – это специальные области, определяемые в программе для хранения разных функциональных частей программы: кода программы (алгоритма обработки данных), переменных программы (значений данных), рабочих ячеек для временного хранения промежуточных значений (в программах такая структура называется стеком). Максимальный размер сегмента в реальном режиме может достигать 64К байт, но в каждой программе сегмент занимает столько места в ОЗУ, сколько требуется для размещения команд программы или обрабатываемых программой данных. Начало каждого сегмента (адрес, в который заносится первая команда или первая описываемая переменная) фиксируется (записывается) в сегментном регистре. В реальном режиме используются 3 основные сегмента и соответствующих сегментных регистра: кодовый – CS, данных – DS, стека – SS.

Сегментный регистр CS содержит адрес инструкции, к которой обращается ОС для начала выполнения программы. Сегментный регистр DS адресует область переменных и ячеек, зарезервированных для результатов обработки данных. Сегментный регистр SS содержит адрес специальной структуры для временного сохранения данных или данных, используемых программой в собственных “вызываемых” подпрограммах.

Сегмент начинается с границы параграфа, т.е. с адреса, кратного 16 (10Н). Поскольку для всех адресов, делящихся нацело на 16, младший шестнадцатеричный разряд равен 0, разработчики компьютера решили не хранить этот разряд в сегментном регистре, уменьшив за счет этого размер регистра на 4 бита. Поэтому адрес сегмента 038Е0Н будет хранится в сегментном регистре как 038ЕН. При необходимости ссылки на физический (фактический) адрес начала сегмента, такой адрес будем записывать в виде 038Е[0]Н.

В программе все ячейки памяти в сегменте нумеруются относительно адреса в соответствующем сегментном регистре. Количество байт от начала сегмента до любого адресуемого в сегменте байта называется смещением (offset). В реальном режиме работы смещение в сегменте размером 64К байт должно изменяться от 0000Н до FFFFH, т.е. для указания смещения в сегменте достаточно 16 двоичных разрядов. Т.о., имея 2 16-битовых регистра для адреса начала сегмента и смещения внутри сегмента, можно адресовать память в 1М байт (не имея сегментации потребовалось бы для адресации ячеек такой памяти 20 двоичных разрядов!). Чтобы обратиться к любой ячейке памяти в сегменте, процессор определяет физический адрес ячейки, складывая значения в сегментном регистре со смещением, при этом не забывая восстановить “отрезанный” шестнадцатеричный нуль младшего разряда сегментного регистра. Например, если в сегменте с начальным адресом 038Е[0]Н команда программы имеет смещение 0032Н, то физический адрес такой команды в ОЗУ будет 038Е[0]Н+0032Н=03912Н. Эту операцию определения физического адреса в ОЗУ процессор выполняет автоматически.

Итак, в компьютере существуют 2 основные схемы адресации:

1) абсолютный или физический адрес, представляющий собой 20-разрядное число, прямо указывающее на определенную ячейку ОЗУ;

2) адрес в системе сегмент:смещение, состоящий из начального адреса сегмента и значения смещения. Каждая составляющая сегмент:смещение представляет собой 16-разрядное число.

(Аналогом абсолютной адресации была бы последовательная нумерация всех зданий в городе, а аналогом системы сегмент:смещение является определение адреса по улице и номеру дома на этой улице).

Программисты редко имеют дело с абсолютной адресацией и даже редко обращают внимание на начало сегмента (ОС сама в большинстве случаев записывает в сегментный регистр соответствующие адреса), а вот смещение внутри сегмента часто приходится учитывать в программах обработки

О сегментах.

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

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

Имена сегментных регистров строго зарезервированы, и поэтому при появлении этих имен в программе процессор обращается к своей внутренней памяти.

 

                                                           Оперативное запоминающее устройство

 

0000
Сегмент стека  
Адрес
Адрес  
Адрес  

 


Сегмент данных
    SS

    DS

Мах адрес
Сегмент кода
    CS

 

Рисунок 4.3. Связь сегментов и сегментных регистров.

Регистр CS содержит адрес первой команды программы. Сумма содержимого этого регистра со значением смещения в указателе инструкций – регистре IP – дает адрес команды программы, которая должна быть передана следующей для исполнения.

Регистр DS содержит адрес первой переменной или константы, объявленной в программе. Команды используют этот регистр для поиска значений операндов, участвующих в операциях обработки. Этот адрес, сложенный со смещением переменной, дает ссылку на определенную ячейку со значениями исходных данных, промежуточных результатов или выходных данных.

Регистр SS позволяет реализовать в памяти стек, который программа использует для временного хранения адресов и данных. Адрес из этого регистра складывается со смещением, хранимым в указателе стека SP, и суммарное значение указывает на текущее слово в стеке.

Регистр ES используется в программах, обрабатывающих строковые последовательности. Если Ваша программа предполагает такую обработку, Вы должны проинициализировать этот регистр соответствующим значением (аналогично принудительной инициализации основного сегмента данных DS).

Описанные выше правила использования стековых регистров процессор применяет автоматически. Как правило, для целей программирования ссылаться на сегментные регистры не нужно.

 



Поделиться:


Последнее изменение этой страницы: 2021-02-07; просмотров: 376; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.216.161.178 (0.01 с.)