Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MU_SRS_SPO.doc
Скачиваний:
5
Добавлен:
13.08.2019
Размер:
538.62 Кб
Скачать

Способы компоновки программ

Рассмотрим три способа компоновки программ.

Первый способ, когда директивы EXTRN и PUBLIC используются для меток. Пример программы состоит из основной программы и подпрограммы.

Текст основной программы

Title UMN (EXE) ; основная программа

Extrn SubUmn:Far ; объявление внешней процедуры

StackSg Segment PARA STACK 'Stack'

DW 64 DUP(?)

StackSg ENDS

DataSg Segment PARA 'Data'

Kol DW 0140H

Price DW 2500H

DataSg ENDS

CodeSg Segment PARA 'Code'

Begin Proc FAR

Assume CS:CodeSg, DS:DataSg, SS:StackSg

Push DS

Sub AX, AX

Push AX

Mov AX, DataSg

Mov DS, AX

Mov AX, Price

Mov BX, Kol

Call SubUmn ; вызов процедуры

Ret

Begin ENDP

CodeSg ENDS

END Begin

Текст внешней подпрограммы

Title SubUmn ; внешняя подпрограмма

CodeSg Segment PARA 'Code'

SubUmn Proc FAR

Assume CS:CodeSg

Public SubUmn ; открытие доступа к подпрограмме

Mul BX ; умножается содержимое AX и BX

Ret ; результат заносится в DX:AX

SubUmn ENDP

CodeSg ENDS

END SubUmn

Карта компоновки отражает организацию программы в памяти.

Start

Stop

Length

Name

Class

00000H

0007FH

00080H

STACKSG

STACK

00080H

00083H

00004H

DATASG

DATA

00090H

000A5H

00016H

CODESG

CODE

000B0H

000B2H

00003H

CODESG

CODE

Здесь имеются два кодовых сегмента для каждого ассемблирования с разными стартовыми адресами.

Второй способ, когда директивы PUBLIC используют при описании кодовых сегментов. В этом случае в директиву Segment вносится оператор Public.

CodeSg Segment PARA PUBLIC 'Code'

При этом карта компоновки будет выглядеть следующим образом:

Start

Stop

Length

Name

Class

00000H

0007FH

00080H

STACKSG

STACK

00080H

00083H

00004H

DATASG

DATA

00090H

000B2H

00023H

CODESG

CODE

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

Третий случай, когда присутствуют общие данные для основной программы и подпрограммы. Это предполагает возможность обработки в одном модуле данных, определенных в другом модуле. Пусть области Price и Kol определялись в основной программе, а загрузка значений из этих областей в регистры производились в подпрограмме. Тогда в тексте основной программы кроме объявления внешней подпрограммы (сразу за ним) добавится строка

Public Kol, Price;

команды

Mov AX, Price

Mov BX, Kol

из основной программы перепишутся в подпрограмму (перед командой умножения). Кроме того, в подпрограмме перед описанием кодового сегмента необходимо описать имена переменных как внешние:

EXTRN Kol:Word, Price:Word

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]