Страница 39 из 56
- регистры SI и DI могут часто использоваться аналогично регист-
рам общего назначения. Кроме того, их используют как индексные
регистры. В Турбо Си их также используют как регистровые пере-
менные;
- регистр SP указывает на текущую вершину стека и является смеще-
нием относительно стекового сегмента;
- регистр BP является вторичным указателем стека, обычно исполь-
зуется для индексирования при поиске параметров, передаваемых в
стеке.
Базовый индексный регистр (BP) используется в функциях Си
как базовый адрес для аргументов и автоматических переменных. Па-
раметры имеют положительные смещения относительно BP, которые су-
щественно зависят от модели памяти и числа регистров, сохраняемых
при вызове функциий. BP всегда указывает на сохраненную ранее ве-
личину BP. Функции, которые не имеют параметров и не имеют в объ-
явлении аргументов, не должны вообще использовать или сохранять
BP.
Автоматические переменные имеют отрицательное смещение от
BP, первая такая переменная имеет наибольшее отрицательное смеще-
ние.
- 319,320 -
Сегментация памяти.
----------------------------------------------------------------
Микропроцессор 8086 имеет сегментированную архитектуру памя-
ти. Он обеспечивает общее адресное пространство величиной 1 Мб,
однако может прямо адресовать только 64К. Логическую единицу па-
мяти размером 64К называют сегментом, отсюда и название "сегмен-
тированная архитектура памяти".
Теперь возникают вопросы: сколько различных сегментов су-
ществует, где они располагаются и как 8086 понимает, где они рас-
положены?
- 8086 работает с 4 различными сегментами: кода, данных,
стека и дополнительных данных.Кодовый сегмент содержит машинную
программу; сегмент данных - данные; стековый сегмент - стек; до-
полнительный сегмент обычно используют для дополнительных дан-
ных;
- 8086 имеет 4 16-битных сегментных регистра, называемых CS,
DS, SS и ES; они указывают на сегменты кода, данных, стека и до-
полнительных данных соответственно;
- сегмент может быть расположен в любом месте памяти.По
причине, которая будет рассмотрена далее, сегмент всегда начина-
ется с адреса, кратного 16 (в десятичной системе).
Вычисление адреса
-----------------------------------------------------------------
Итак, каким же образом 8086 использует эти сегментные регис-
тры для вычисления адреса? Полный адрес 8086 получает из 2-х
16-битных величин: адреса сегмента и смещения. Предположим, что
адрес сегмента данных - величина в DS регистре - 2F84 (HEX-код),
и вы хотите вычислить реальный адрес некоторых данных, которые
имеют смещение 0532 (HEX-код) от начала сегмента данных. Как это
делается?
Вычисление адреса происходит следующим образом: величина
сегментного регистра сдвигается на 4 бита (1 разряд HEX-кода)
влево и затем складывается со смещением. Полученная в результате
20-битная величина есть реальный адрес данных, что иллюстрирует
- 321,322 -
следующая запись:
DS регистр (сдвинутый) 0010 1111 1000 0100 0000 = 2F840
смещение 0000 0101 0011 0010 = 00532
адрес 0010 1111 1101 0111 0010 = 2FD72
Начальный адрес сегмента - всегда 20-битное число, однако
сегментный регистр содержит только 16 бит. Т.о., младшие 4 бита
всегда предполагаются равными нулю. Это означает, как мы уже от-
мечали, что сегменты могут начинаться только с адреса, кратного
16-и, т.е. с адреса, в котором младшие 4 бита (младшая HEX-цифра)
нулевые.
T.о., если DS-регистр содержит величину 2F84, то сегмент
данных реально начинается с адреса 2F840. Как отмечалось, отрезок
памяти из 16 байт называется параграфом, т.е. этот сегмент всегда
начинается на границе параграфа. Стандартно адрес представляется
=, < и <=) исполь-
зуют только смещение.
Для операторов == и != необходимы все 32 бита для того, что-
бы можно было произвести сравнение с NULL указателем
(0000:0000).В противном случае, если для проверки равенства вы
используете только смещение, то любой указатель со смещением 0000
будет равен NULL указателю, а это не является тем, что вы хотите.
Еще вам необходимо знать следующее. Если вы прибавляете ве-