Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


К лабораторной работе № 2



Способы адресации

Способы адресации подробно расписаны в [4-5].

 

К лабораторной работе № 3

Обработка прерываний

Функции прерывания с примерами рассмотрены в [4-5].

 

К лабораторной работе № 4

Распределение памяти

Общие положения

Любая программа обычно состоит из подпрограмм. Для удобства отладки больших по объему подпрограмм их обычно оформляют как самостоятельные модули (файлы), т.е. в виде внешних подпрограмм. Каждый такой модуль ассемблируется отдельно и генерирует собственный уникальный объектный модуль. Программа компоновщик затем объединяет объектные модули в один объединенный выполняемый модуль.

 

Команды и директивы межсегментного вызова

Для связей между подпрограммами используются следующие команды:

CALL имя_подпрограммы - команда запоминает адрес возврата и передает управление процедуре.
EXTRN имя:тип [,...] - директива описывает идентификаторы, которые определены (и директиве PUBLIC) в других модулях.
PUBLIC идентификатор [,...] - делает идентификатор доступным для других модулей.

 

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

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

Первый способ, когда директивы 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

 

Порядок отладки

Пусть текст основной программы записан в файле PR1.ASM, текст внешней подпрограммы - в файле PR2.ASM. Используем программу MASM для получения двух объектных модулей: PR1.OBJ и PR2.OBJ. Затем компоновщиком объединяем два объектных модуля в один выполняемый. Для этого на запросы компоновщика необходимо ответить следующим образом:

 

Object modules [.OBJ] : PR1 + PR2

Run file [.EXE] : PR (или любое другое имя)

 

Компоновщик устанавливает соответствие между адресами в объектных модулях.

 

Более подробно см. [4-5].

 


Поделиться:



Последнее изменение этой страницы: 2019-05-07; Просмотров: 279; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.016 с.)
Главная | Случайная страница | Обратная связь