Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Assembler (Уч_пос_Лаб_Ч1).doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.43 Mб
Скачать

6.2.4. Структура программы для .Exe- и .Com-файлов. Образ программы в памяти

Программы, выполненные под управлением DOS, могут принадлежать к одному из двух типов, которым соответствуют расширения имён программных файлов .com и .exe. Основное различие этих программ заключается в том, что программы типа .com состоят из единственного сегмента объёмом в 64 Кбайт, в котором размещаются программный код, данные и стек, а в программах типа .exe для каждого из них выделяются отдельные сегменты. Управление сегментами – один из наиболее сложных аспектов программирования на языке ассемблера. При этом ассемблер имеет не один, а целых два набора директив управления сегментами [5, 6, 8, 13, 14]. Первый набор, включающий упрощенные директивы определения сегментов, позволяет достаточно просто ими управлять и идеально подходит для компоновки ассемблерных модулей с языками высокого уровня (Pascal и Си). Второй набор, включающий стандартные директивы определения сегментов, предназначен для построения сложных ассемблерных программ. В данном лабораторном практикуме, как правило, применяются упрощенные директивы, введение которых возможно лишь с одновременным указанием используемой модели памяти. В свою очередь, модель памяти неявно задаёт атрибуты упрощенных директив, определяющих действия компоновщика Turbo Linker при формировании исполнительного файла программы (см. табл. 1.1). Дадим краткую характеристику указанных в табл. 1.1 атрибутов.

Таблица 1.1

Сегменты упрощенной модели памяти Small

Директива

Имя

Выравнивание

Объединение

Класс

Группа

Codeseg

_Text

Word

Public

'Code'

Dataseg

_Data

Word

Public

'Data'

Dgroup

Stack

Stack

Para

Stack

'Stack'

Dgroup

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

  • Имя – идентификатор данного сегмента, используемый при назначении адреса и комбинировании (объединении) с другими сегментами.

  • Выравнивание – указывает граничные значения на начало сегмента. В процессе ассемблирования, если текущая позиция в начале сегмента не удовлетворяет установленному атрибуту, счётчик адреса увеличивается на соответствующую величину, смещая начало сегмента в область старших адресов (wordначало сегмента должно иметь чётный адрес, paraчётный адрес, кратный параграфу, т.е. 16 бит)

  • Объединение – устанавливает правила объединения нескольких сегментов с одинаковым именем. Параметр Public приводит к последовательному объединению сегментов с одинаковым именем в один большой сегмент, имеющий адрес первого из объединяемых сегментов.

  • Класс – выполняет роль категории сегмента. Все сегменты одинакового класса во время работы компоновщика физически располагаются друг за другом в памяти

  • Группа – позволяет осуществить доступ к данным из всех сегментов, находящихся в ней, с помощью загрузки адреса группы в сегментный регистр.

Наибольшее применение в ассемблерных программах с расширением .exe нашла малая модель памяти Model small, предусматривающая размещение структурных частей программы в двух сегментах:

  • сегмент кода программы (64 Кбайт),

  • сегмент данных и стека, принадлежащих одной группе Dgroup (64 Кбайт).

Шаблон программы для exe-файлов с подробными комментариями представлен на рис. 1.1. Здесь отметим лишь оформление начала и конца кодового сегмента. Для того чтобы понять, почему кодовый сегмент начинается с загрузки сегментного регистра данных ds, а не с загрузки сегментного регистра cs, необходимо рассмотреть функции DOS при загрузке программы в память.

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