|
Затем
внутри этого блока формируется действительная ссылка, используя
смещение от начала этого блока. Это смещение появляется в счетчи-
ке программы, в ссылках на память и внутри косвенных ссылок на
память через регистры.
Что это означает для выполнения программ с различными типами
кодирования? Эти типы ссылок и случаи, когда они используются,
определяют как программа загружается в память, какие особенности
она может использовать и как программа может быть структурирова-
на. Рассмотрим как создаются эти ссылки и как их использовать для
создания более совершенных программ.
- 2-21 -
Размещение программного кода в памяти
Понимание альтернатив размещения программного кода в памяти
требует ясного понимания работы как инструкций управления выпол-
нением программы (CALL - вызов процедуры, RET - возврат из проце-
дуры и JMP - безусловный переход), так и доступа к памяти микро-
процессора 8086, так как это прежде всего ограничивает возможнос-
ти программиста при размещении программы в доступном пространстве
памяти.
Инструкции управления выполнением программы часто называют
инструкциями передачи управления, которые включают две основные
инструкции CALL - вызов процедуры и JMP - безусловный переход.
Каждый случай, когда программа начинает выполнение с нового места
в памяти, называется "пунктом назначения". Каждая из этих функций
имеет три опции реализации для указания пункта назначения. Этими
опциями являются: текущее относительное размещение, адресация от-
носительно текущего сегмента и абсолютная адресация.
Относительное размещение
Текущее относительное размещение иногда называют относитель-
ным PC (program counter) счетчиком программы, который вычисляет
адрес пункта назначения от текущего адреса и смещение. Для форми-
рования адреса пункта назначения смещение добавляется к текущему
размещению. В связи с тем, что полная операция в целом не зависит
от абсолютного расположения программного кода в памяти, результи-
рующий адрес имеет независимое размещение. Если в памяти пересы-
лается целый блок программы, то созданный скорректированный адрес
пункта назначения указывает на новое положение инструкции пункта
назначения.
Этот способ вычисления адреса передачи используется во всех
инструкциях условного перехода, во всех внутрисегментных (корот-
ких или близких) инструкциях JMP (безусловный переход) и во всех
внутрисегментных (близких) инструкциях CALL (вызов процедуры).
"Непосредственная" означает, что инструкция (JMP или CALL) содер-
жит смещение как непосредственные данные. Напротив, "косвенная"
(непрямая) инструкция - это инструкция (JMP или CALL) для адреса,
содержащегося в 16-битовом регистре (только смещение), или для
адреса, содержащегося в 16-битовой или 32-битовой ячейке памяти
(смещение или смещение и сегмент). В связи с тем, что прямые пе-
редачи управления не включают действительные адреса, то они могут
быть размещены в памяти где угодно и даже могут быть пересланы
внутри сегмента, пока исходные инструкции (JMP и CALL) и програм-
ма пункта назначения пересылаются совместно.
Адресация относительно текущего сегмента
Адресация относительно текущего сегмента указывает на значе-
ние действительного смещения для загрузки в указатель инструкции
(как при косвенной инструкции CALL - вызвать процедуру) или для
использования в качестве указателя данных.
|