Читать «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. (
В нашем конкретном случае в модуле М2 надо указать директиву
EXTRN X:BYTE, К:ABS
Она сообщает ассемблеру, что имена X и К являются, как говорят, внешними по отношению к данному модулю, т. е. берутся извне, из другого модуля, и потому ассемблер не должен искать описание этих имен в модуле М2.
Кроме того, в директиве указываются и типы имен. Например, в нашей директиве сказано, что X - имя переменной размером в байт. Без этой информации ассемблер не сможет правильно оттранслировать команды и директивы, содержащие имя X. В самом деле, как ассемблер должен транслировать команду МО^ Х,0 - как пересылку байта или как пересылку слова? Чтобы не было такой неопределенности, и надо указывать ассемблеру типы внешних имен. Типы BYTE) WORD и DWORD указываются для имен переменных, тип ABS - для имен коН' стант, а типы NEAR и FAR - для меток или имен процедур. Например, директив
EXTRN P:FAR
которую, как следует из всего сказанного, надо поместить в модуль Ml, сообщает, что Р - это метка или имя процедуры из какого-то иного модуля, причем вызов ее должен быть дальним.
Отметим, что ответственность за согласованность типа внешнего имени, указанного в директиве EXTRN, и типа, которое имя получает при описании в ’’своем" модуле, несет автор программы. Например, если в модуле Ml имя К описано как имя константы, то и в модуле М2 внешнее имя К должно быть объявлено именем константы (указано с типом ABS).