Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 155

Unknown Author

должны бояться, что используемые ими имена совпадут.

12.2.2. Внешние и общие имена. Директивы EXTRN и PUBLIC

Хотя обычно в виде модулей описываются достаточно независимые друг от друга части программы, эти модули, конечно, как-то взаимодействуют друг с другом - делают переходы, обмениваются данными. И вот при таком взаимодействии возникает ряд проблем. Рассмотрим их.

Пусть в программе имеется два модуля Ml и М2. Пусть в М2 описана процедура Р, к которой будет обращаться модуль Ml, и пусть модуль М2, в свою очередь, пользуется переменной X и константой К из модуля Ml:

; модуль Ml    ; модуль М2

X DB ?    Р PROC FAR

К EQU 100

MOV Х,0

CALL Р    MOV АХ,К

При независимой трансляции модулей ассемблер сталкивается со следующей проблемой. Имена X и К принадлежат модулю Ml, поэтому они описываются в модуле Ml и не должны описываться в модуле М2. Когда ассемблер транслирует модуль М2, то в это время он ничего не знает о модуле Ml, о его именах. Поэтому, встретив в М2 имена X и К и не найдя их описания в М2, ассемблер, конечно, зафиксирует ошибку ’’неописанное имя”. Чтобы не было такой ошибки, надо как-то сообщить ассемблеру, что имена X и К, хотя и используются в М2, описаны все же в другом модуле, откуда они и берутся. Такое сообщение делается с помощью директивы EXTRN (external, внешний), имеющей следующий вид:

EXTRN <имя>:<тип>, ..., <имя>:<тип>

где <тип> - это BYTE, WORD, DWORD, ABS, NEAR или FAR. (Замечание: ABS - это стандартная константа ЯА со значением 0.) Данная директива может указываться любое число раз и в любых местах модуля.

В нашем конкретном случае в модуле М2 надо указать директиву

EXTRN X:BYTE, К:ABS

Она сообщает ассемблеру, что имена X и К являются, как говорят, внешними по отношению к данному модулю, т. е. берутся извне, из другого модуля, и потому ассемблер не должен искать описание этих имен в модуле М2.

Кроме того, в директиве указываются и типы имен. Например, в нашей директиве сказано, что X - имя переменной размером в байт. Без этой информации ассемблер не сможет правильно оттранслировать команды и директивы, содержащие имя X. В самом деле, как ассемблер должен транслировать команду МО^ Х,0 - как пересылку байта или как пересылку слова? Чтобы не было такой неопределенности, и надо указывать ассемблеру типы внешних имен. Типы BYTE) WORD и DWORD указываются для имен переменных, тип ABS - для имен коН' стант, а типы NEAR и FAR - для меток или имен процедур. Например, директив

EXTRN P:FAR

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

Отметим, что ответственность за согласованность типа внешнего имени, указанного в директиве EXTRN, и типа, которое имя получает при описании в ’’своем" модуле, несет автор программы. Например, если в модуле Ml имя К описано как имя константы, то и в модуле М2 внешнее имя К должно быть объявлено именем константы (указано с типом ABS).