- •1. Цели и задачи самостоятельной работы
- •Распределение часов по семестрам и видам занятий
- •Команды по работе с текстом
- •Команды, использующие регулярные выражения
- •Сбор сведений о системе и управление процессами Команды получения сведений о системе
- •Команды по работе с процессами
- •Команды по управлению правами
- •Команды по управлению пользователями
- •Способы компоновки программ
- •Порядок отладки
- •К лабораторной работе № 5 Препроцессоры Макроопределения
- •Библиотека макроопределений.
- •Псевдооператоры Макроассемблера.
- •Считывание библиотеки макроопределений в программу
- •К лабораторной работе № 6 Организация дочерних процессов
- •К лабораторной работе /№ 7 Файловая система Основные характеристики файловой системы ms-dos
- •Функции создания и чтения файла
- •Функции прямого доступа к файлу
- •Примеры по программированию операций над файлами
- •Cписок использованных источников
Способы компоновки программ
Рассмотрим три способа компоновки программ.
Первый способ, когда директивы 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