Реклама:

Память процессора 8088, состоящая из массива адресуемых 8-разрядных байтов, применяется для хранения команд, данных и стека. Для разделения областей памяти, применяемых для разных целей, в процессоре 8088 вводится понятие сегментов, которые представляют собой отделенные друг от друга блоки памяти. Такой сегмент в 8088 состоит из 65 536 последовательных байтов. Всего сегментов четыре: кодовый, данных, стековый и дополнительный.

В кодовом сегменте содержатся команды, из которых состоят программы. Содержимое регистра РС всегда интерпретируется как адрес кодового сегмента в памяти. Нулевое значение РС указывает не на абсолютный нулевой адрес в памяти, а на нижний адрес в данном кодовом сегменте. В сегменте данных сохраняются инициализированные и неинициализированные данные программы. Если в регистре ВХ содержится указатель, он обязательно указывает на сегмент данных. В стековом сегменте содержатся локальные переменные и промежуточные результаты, помещенные в стек. Адреса, указанные в регистрах БР и ВР, всегда относятся к стековому сегменту. Дополнительный сегмент - это вспомогательный сегментный регистр, который по необходимости можно разместить в произвольном месте в памяти.

Каждому из этих сегментов соответствует один из 16-разрядных сегментных регистров: СБ, ОБ, ББ или ЕБ. Начальным адресом сегмента является 20-разрядное целое число без знака, формируемое путем сдвига сегментного регистра на 4 бита влево и размещения в четырех освободившихся позициях справа четырех нулей. Следовательно, сегментные регистры в рамках 20-разрядного адресного пространства всегда выражаются числами, кратными 16. Сегментный регистр указывает на базу сегмента. Адреса сегментов формируются путем преобразования 16-разрядного значения в сегментном регистре в фактический 20-разрядный адрес - для этого в конец значения прибавляется четыре нулевых бита и выполняется смещение. В итоге абсолютный адрес в памяти устанавливается путем умножения значения в сегментном регистре на 16 и прибавления смещения. К примеру, если значение DS равняется 7, а ВХ - 12, значит, ВХ указывает на адрес 7x16+12 = 124. Иными словами, на основании значения 7 в регистре DS можно получить 20-разрядный двоичный адрес 00000000000001110000. Добавив к исходному значению сегмента 16-разрядное смещение 0000000000001100 (десятичное 12), получаем 20-разрядный адрес 00000000000001111100 (десятичное 124).

При каждом обращении к памяти один из сегментных регистров применяется для формирования фактического адреса в памяти. Если та или иная команда содержит непосредственный адрес без указания на регистр, считается, что этот адрес находится в сегменте данных, и для определения базы этого сегмента используется регистр DS. Физический адрес определяется путем сложения результата предыдущей операции с адресом, указанным в команде. Физический адрес в памяти кода следующей команды устанавливается путем смещения содержимого регистра CS на четыре двоичных разряда и сложения со значением счетчика команд. Иными словами, сначала на основе значения 16-разрядного регистра CS вычисляется фактический 20-разрядный адрес, а затем к нему прибавляется новое 16-разрядное значение PC; в результате получается 20-разрядный абсолютный адрес в памяти.

Стековый сегмент состоит из 2-байтовых слов, а это значит, что в указателе стека (SP) может храниться только четное число. Стек заполняется в порядке от больших адресов к меньшим. Таким образом, команда PUSH уменьшает значение указателя стека на 2, а затем сохраняет операнд по адресу в памяти, вычисленному на основании значений SS и SP. Команда POP извлекает полученное после выполнения операции PUSH значение и увеличивает значение SP на 2. Те адреса в стековом сегменте, которые расположены ниже предела, определяемого регистром SP, считаются свободными. Следовательно, очистка стека осуществляется за счет одного лишь приращения SP. На практике значения регистров DS и SS всегда совпадают, так что для обращения к переменной в общем сегменте данных и стека достаточно 16-разрядного указателя. Если бы значения регистров DS и SS различались, к каждому указателю потребовалось бы прибавлять 17-й бит - только так можно было бы различить указатели на сегмент данных и на стековый сегмент. По большому счету, создание разработчиками микросхемы отдельного стекового сегмента вряд ли можно признать оправданным.

Если адреса в четырех сегментных регистрах значительно отстоят друг от друга, эти сегменты разделяются, однако в условиях ограниченного объема доступной памяти разделять их не обязательно. Объем программного кода после компиляции неизвестен. Поэтому эффективнее всего размещать начальную границу сегмента данных и стекового сегмента через первое кратное 16 значение после последней команды. В этом решении подразумевается, что кодовый сегмент и сегмент данных ни при каких обстоятельствах не будут использовать один и тот же физический адрес.

Память и адресация || Оглавление || Адресация-B