Ассемблер и программирование для IBM PC



         

ГЛАВА 21. Компановка программ - часть 7


Рассмотрим, каким образом компановщик согласует данные, определенные в основной программе и имеющие ссылки из подпрограммы.

ПРОГРАММА: ОБЩИЕ ДАННЫЕ В ПОДПРОГРАММЕ

Ассемблер для IBM PC. Глава 21 7

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

Наличие общих данных предполагает возможность обработки в одном ассемблерном модуле данных, которые определены в другом ассемблерном модуле. Изменим предыдущий пример так, чтобы области QTY и PRICE по-прежнему определялись в основной программе, но загрузка значений из этих областей в регистры BX и AX выполнялась в подпрограмме. Такая программа приведена на рис.21.5. В ней сделаны следующие изменения:

ъ В основной программе имена QTY и PRICE определены как PUBLIC. Сегмент данных также определен с атрибутом PUBLIC. Обратите внимание на атрибут Global (глобаль ный) для QTY и PRICE в таблице идентификаторов.

ъ В подпрограмме имена QTY и PRICE определены как EXTRN и WORD. Такое определение указывает ассемблеру на длину этих полей в 2 байта. Теперь ассемблер сгенерирует правильный код операции для команд MOV, а компановщик установит значения операндов. Заметьте, что имена QTY и PRICE в таблице идентификаторов имеют атрибут External (внешний).

------------------------------------------------------------ ------------------------------------------------------------ Рис.21.5. Общие данные в подпрограмме.

Команды MOV в листинге подпрограммы имеют следующий вид:

A1 0000 E MOV AX,PRICE 8B 1E 0000 E MOV BX,QTY

В объектном коде шест.A1 обозначает пересылку слова из памяти в регистр AX, а шест.8B - пересылку слова из памяти в регистр BX (объектный код для операций с регистром AX чаще требует меньшее число байтов, чем с другими регистрами). Трассировка выполнения программы показывает, что компановщик установил в объектном коде следующие операнды:

A1 0200 8B 1E 0000

Объектный код теперь идентичен коду сгенерированному в преды дущем примере, где команды MOV находились в вызывающей программе. Это логичный результат, так как операнды во всех трех программах базировались по регистру DS и имели одинаковые относительные адреса. Основная программа и подпрограмма могут определять любые другие элементы данных, но общими являются лишь имеющие атрибуты PUBLIC и EXTRN. Следуя основным правилам, рассмотренным в данной главе, можно теперь компановать программы, состоящие более чем из двух ассемблерных модулей и обеспечивать доступ к общим




Содержание  Назад  Вперед