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

Ibm Personal Computer Linker

Version 2.30 (C) Copyright IBM Corp 1981, 1985

Object Modules: B:CALLMUL3+B:SUBMUL3

Run File: [B:CALLMUL3.EXE]:

List File: [NUL.MAP]: CON

Libraries [.LIB]:

Start Stop Length Name Class

00000H 00019H 001AH CODESG CODE

00030H 00033H 0004H DATASG DATA

00040H 000BFH 0080H STACKSG STACK

PROGRAM entry point at 0000:0000

__________________________________________________________________________

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

Наличие общих данных предполагает возможность обработки в одном

ассемблерном модуле данных, которые определены в другом ассемблерном

модуле. Изменим предыдущий пример так, чтобы области QTY и PRICE

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

этих областей в регистры BX и AX выполнялась в подпрограмме. Такая

программа приведена на рис.21.5. В ней сделаны следующие изменения:

- В основной программе имена QTY и PRICE определены как PUBLIC.

Сегмент данных также определен с атрибутом PUBLIC. Обратите внимание

на атрибут Global (глобальный) для QTY и PRICE в таблице

идентификаторов.

- В подпрограмме имена QTY и PRICE определены как EXTRN и WORD.

Такое определение указывает ассемблеру на длину этих полей в 2 байта.

Теперь ассемблер сгенерирует правильный код операции для команд MOV,

а компоновщик установит значения операндов. Заметьте, что имена QTY и

PRICE в таблице идентификаторов имеют атрибут External (внешний).

Команды 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.

Следуя основным правилам, рассмотренным в данной главе, можно теперь

компоновать программы, состоящие более чем из двух ассемблерных модулей и

обеспечивать доступ к общим данным из всех модулей. При этом следует

предусматривать стек достаточных размеров - в разумных пределах, для

больших программ определение 64 слов для стека бывает достаточным.

В гл.23 будет рассмотрены дополнительные свойства сегментов, включая

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

ассемблерном модуле и использование директивы GROUP для объединения

сегментов в один общий сегмент.

ПЕРЕДАЧА ПАРАМЕТРОВ

________________________________________________________________

__________________________________________________________________________

page 60,132

TITLE CALLMULL4 (EXE) Передача параметров

; в подпрограмму

EXTRN SUBMUL:FAR

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