Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АССЕМБЛЕР И ПРОГРАММИРОВАНИЕ ДЛЯ IBM PC.doc
Скачиваний:
49
Добавлен:
25.05.2014
Размер:
3.21 Mб
Скачать

04Af в регистр cs. Комбинация этих адресов указывает на первую выполняемую

команду в вызываемой подпрограмме:

Кодовый сегмент 04AF0

Смещение в IP 0200

Действительный адрес 04CF0

При выходе из вызванной процедуры межсегментная команда возврата REP

восстанавливает оба адреса в регистрах CS и IP и таким образом передает

управление на следующую после CALL команду.

АТРИБУТЫ EXTRN и PUBLIC

________________________________________________________________

Рассмотрим основную программу (MAINPROG), которая вызывает

подпрограмму (SUBPROG) с помощью межсегментного CALL, как показано на

рис.21.2.

Команда CALL в MAINPROG должна "знать", что SUBPROG существует вне

данного сегмента (иначе ассемблер выдаст сообщение о том, что

идентификатор SUBPROG не определен). С помощью директивы EXTRN можно

указать ассемблеру, что ссылка на SUBPROG имеет атрибут FAR,

т.е.определена в другом ассемблерном модуле. Так как сам ассемблер не

имеет возможности точно определить такие ссылки, он генерирует "пустой"

объектный код для последующего заполнения его при компановке:

9A 0000 ---- E

Подпрограмма SUBPROG содержит директиву PUBLIC, которая указывает

ассемблеру и компоновщику, что другой модуль должен "знать" адрес SUBPROG.

В последнем шаге, когда оба модуля MAINPROG и SUBPROG будут успешно

ассемблированы в объектные модули, они могут быть скомпонованы следующим

образом:

Запрос компоновщика LINK: Ответ:

Object Modules [.OBJ]: B:MAINPROG+B:SUBPROG

Run File [filespec.EXE]: B:COMBPROG (или другое имя)

List File [NUL.MAP]: CON

Libraries [.LIB]: [return]

Компоновщик устанавливает соответствия между адресами EXTRN в одном

объектном модуле с адресами PUBLIC в другом и заносит необходимые

относительные адреса. Затем он объединяет два объектных модуля в один

выполняемый. При невозможности разрешить ссылки компоновщик выдает

сообщения об ошибках. Следите за этими сообщениями прежде чем пытаться

выполнить программу.

__________________________________________________________________________

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬

¦ EXTRN SUBPROG:FAR ¦

¦ MAINPROG: . ¦

¦ . ¦

¦ CALL SUBPROG ¦

¦ . ¦

¦ . ¦

ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ

¦ PUBLIC SUBPROG ¦

¦ SUBPROG: . ¦

¦ . ¦

¦ . ¦

¦ RET ¦

АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

__________________________________________________________________________

Рис.21.2. Межсегментный вызов.

Директива EXTRN

-----------------

Директива EXTRN имеет следующий формат:

EXTRN имя:тип [, ... ]

Можно определить более одного имени (до конца строки) или закодировать

дополнительные директивы EXTRN. В другом ассемблерном модуле

соответствующее имя должно быть определено и идентифицировано как PUBLIC.

Тип элемента может быть ABS, BYTE, DWORD, FAR, NEAR, WORD. Имя может быть

определено через EQU и должно удовлетворять реальному определению имени.

Директива PUBLIC

------------------

Директива PUBLIC указывает ассемблеру и компоновщику, что адрес

указанного идентификатора доступен из других программ. Директива имеет

следующий формат:

PUBLIC идентификатор [, ... ]

Можно определить более одного идентификатора (до конца строки) или

закодировать дополнительные директивы PUBLIC. Идентификаторы могут быть

метками (включая PROC-метки), переменными или числами. Неправильными

идентификаторами являются имена регистров и EQU-идентификаторы,

определяющие значения более двух байт.

Рассмотрим три различных способа компановки программ.

ПРОГРАММА: ИСПОЛЬЗОВАНИЕ ДИРЕКТИВ EXTRN и PUBLIC ДЛЯ МЕТОК

_______________________________________________________________

__________________________________________________________________________

page 60,132

TITLE CALLMULL1 (EXE) Вызов подпрограммы умнож.

EXTRN SUBMUL:FAR

;-----------------------------------------------