Здавалка
Главная | Обратная связь

Теоретические указания



Программы, выполняемые под управлением MS-DOS, могут принадлежать к одному из двух типов, которым соответствуют расширения имен программных файлов .СОМ и .ЕХЕ. основное различие этих программ заключается в том, что программы типа .СОМ состоят из единственного сегмента, в котором размещаются программные коды, данные и стек, а в программах типа .ЕХЕ для собственно программы, данных и стека предусматриваются отдельные сегменты. Таким образом, размер программы типа .СОМ не может превысить 64 Кбайт, а размер программы типа .ЕХЕ практически не ограничен, т.к. в нее может входить любое число сегментов программы и данных.

Структура и образ памяти программы .ЕХЕ.

title Программа типа .ЕХЕ

text segment ‘Code’

assume CS : text, DS : data

myproc proc

mov AX, data

mov DS, AX

… ; текст программы

myproc endp

text ends

data segment

… ; определения данных

data ends

stack segment stack ‘Stack’

dw 128 dup(0)

stack ends

end myproc

 

Структура и образ памяти программы .COM.

title Программа типа .COM

text segment ‘Code’

assume CS : text, DS : text

org 100h

myproc proc

… ; текст программы

myproc endp

… ; определения данных

text ends

end myproc

 

Описание программы типа .ЕХЕ. Рассмотрим структуру программы. Оператор TITLE позволяет предпослать программе текстовый заголовок., который будет выводиться на все страницы листинга трансляции. Программа состоит из трех сегментов: сегмента команд, или программного сегмента с произвольным именем text, сегмента данных с именем data и сегмента стека с именем stack. Каждый сегмент открывается оператором SEGMENT и закрывается оператором ENDS. Перед обоими операторами должно стоять имя сегмента. Порядок сегментов в большинстве случаев роли не играет.

Слово ‘CODE’, стоящее в апострофах в строке описания сегмента команд, указывает класс сегмента – «программный». Классы сегментов анализируются компоновщиком и используются им при компоновке загрузочного модуля: сегменты, принадлежащие одному классу, загружаются в память друг за другом. Текст сегмента команд начинается с оператора ASSUME, который позволяет транслятору сопоставить сегментные регистры и адресуемые ими сегменты. Определение CS:text указывает транслятору, что данный сегмент является программным и будет адресоваться с помощью сегментного регистра CS. Определение DS:data закрепляет за сегментом data сегментный регистр DS, как регистр, используемый по умолчанию, что позволяет ссылаться на переменные, описанные в сегменте data, без явного указания регистра DS. При этом ассемблер проверяет, действительно ли они описаны в сегменте data.

Собственно программа обычно состоит из процедур. Деление программы на процедуры не обязательно, но повышает ее наглядность и облегчает передачу управления на подпрограммы и другие программные модули. Данная программа содержит единственную процедуру myproc, открываемую оператором PROC и закрываемую оператором ENDP. Перед обоими операторами указывается имя процедуры. В первых строках программы инициализируется регистр DS – в него заносится сегментный адрес сегмента данных. Поскольку передача в сегментные регистры непосредственных значений не допускается, в качестве «первоначального пункта» используется регистр АХ. После того, как регистр DS инициализирован, программа может обращаться к данным, описанным в регистре данных. Сегмент данных содержит описания всех переменных, используемых в программе.

Строка описания сегмента стека должна содержать класс сегмента – ‘STACK’, а также тип объединения – STACK. Тип объединения указывает компоновщику, каким образом должны объединяться одноименные сегменты разных модулей – накладываясь друг на друга или присоединяясь друг к другу (STACK-для сегментов стека). В этом случае при загрузке программы выполняется автоматическая инициализация регистров SS (адрес начала сегмента стека) и SP (смещение конца сегмента стека). В данном случае для стека резервируется 128 слов памяти. Текст программы заканчивается директивой END, завершающей трансляцию. В качестве операнда этой директивы указывается точка входа в главную процедуру.

Образ программы в памяти начинается с префикса программного сегмента (Program Segment Prefics, PSP), образуемого и заполняемого системой. PSP всегда имеет размер 256 байтов содержит таблицы и поля данных, используемые системой в процессе выполнения программы. Вслед за PSP располагаются сегменты программы. Сегментные регистры автоматически инициализируются следующим образом: ES и DS указывают на начало PSP, CS – на начало сегмента команд, а SS – на начало сегмента стека. В указатель команд IP загружается относительный адрес точки входа в программу, а в указатель стека SP – смещение конца сегмента стека. Таким образом, при загрузке программы в память адресуемыми оказываются все сегменты, кроме сегмента данных. Инициализация регистра DS в первых строках программы позволяет сделать адресуемым и этот сегмент.

Описание программы типа .СОМ. Программа содержит единственный сегмент text, которому присвоен класс ‘CODE’. В операторе ASSUME указано, что сегментные регистры CS и DS будут указывать на этот единственный сегмент. Оператор ORG 100h резервирует 256 байтов памяти для PSP. Заполнять PSP будет сама система, но место под него должен выделить программист. В программе нет необходимости инициализировать регистр DS, поскольку его, как и остальные сегментные регистры, инициализирует сама система. Данные можно разместить после программной процедуры, или внутри нее, или после нее. Регистр IP всегда инициализируется числом 100h. После загрузки программы все сегментные регистры указывают на начало единственного сегмента. Указатель стека автоматически инициализируется числом FFFEh. Независимо от фактического размера программы ей выделяется 64 Кбайт адресного пространства, всю нижнюю часть которого занимает стек.

 

Задания

1. Написать программу типа .EXE, которая выводит на экран строку «Это программа типа .EXE».

2. Написать программу типа .СОМ, которая выводит на экран строку «Это программа типа .СОМ».

 

Вопросы для самоконтроля

1. Сколько типов программ существует под управлением MS-DOS?

2. В чем заключается основное различие программ типа .EXE и .COM?

3. Опишите структуру и образ памяти типа .EXE.

4. Опишите структуру и образ памяти типа .COM.

5. Какое количество байтов не может превысить программа типа .COM?

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.