Иллюстрированный самоучитель по SVGA

Учет особенностей компилятора

Прототип процедуры

Если процедура и вызывающий модуль готовятся независимо друг от друга и объединяются только при компоновке задачи, то выполнить указанное выше условие невозможно. В таком случае в текст вызывающего модуля включается прототип процедуры. Для его описания существует специальная директива, имеющая следующий формат:

имя_процедуры PROTO тип [langtype] [, список_параметров ]

Для составления прототипа нужен либо исходный текст процедуры, либо исчерпывающее описание способа вызова соответствующего ей объектного или библиотечного модуля, либо образец прототипа, взятый из другого программного модуля, вызывающего данную процедуру.

Рассмотрим конкретный случай. Предположим, что процедура, описанная в примере В. 7, подготовлена в виде объектного модуля. Для создания ее прототипа надо взять из примера В. 7 строку, содержащую директиву PROC, заменить слово PROC на PROTO и исключить описание сохраняемых в стеке регистров (USES edx fs si).

В результате получится следующий прототип:

cnvindec PROTO FAR PASCAL, addressrdword

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

При компиляции вызывающего модуля Макроассемблеру недоступно описание процедуры, поэтому имя процедуры, ее тип и значение Langtype он "принимает на веру", но имена параметров проверяет обязательно.

В списке PROTO указываются имена формальных параметров. Они не должны совпадать с именами переменных, описанных в вызывающем модуле. В противном случае Макроассемблер выдаст сообщение о повторном определении имени и прервет процесс компиляции. При успешной компиляции имена и размеры параметров включаются в объектный модуль и используются компоновщиком при сборке задачи. На стадии сборки известны описание процедуры и способ ее вызова и компоновщик проверяет их соответствие друг другу.

Заключение

Практическая ценность директив PROC, PROTO и INVOKE состоит в том, что при их использовании Макроассемблер самостоятельно учитывает особенности компиляторов при формировании параметров в стеке и оформлении пролога и эпилога процедуры. Это позволяет разрабатывать процедуры, не зависящие от языка программирования, на котором составлен вызывающий модуль. Кроме того, директива PROTO позволяет использовать в вызывающем модуле, составленном на языке ассемблера, модули из библиотек, входящих в состав компиляторов Си, Фортрана, Паскаля и Бейсика. Однако для этого вам должно быть доступно описание этих библиотек.

В тексте данного раздела мы не упоминали об одной важной детали. Для успешной разработки общедоступных процедур недостаточно знать только язык ассемблера. Вы должны иметь представление не только о языке программирования, на котором будет составлен вызывающий модуль, но и о возможностях конкретного компилятора с этого языка. Все существующие компиляторы поддерживают расширенные версии языков программирования, Макроассемблер не является исключением. А вот в чем заключается это расширение, зависит от конкретной реализации компилятора.

И последнее. Навыки программирования приобретаются не при чтении книг, а в процессе практической деятельности. Успехов вам на этом поприще, уважаемый Читатель и Программист!

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.