logo
Полный текст учебника

Структура программы на языке ассемблера для создания файла exe

Операционная система MS DOS предъявляет некоторые обязательные требования к структуре ASM-программы, предназначенной для последующего создания EXE-файла.

Программа может использовать 4 сегмента памяти, начальные адреса которых должны быть загружены в регистры микропроцессора CS, SS, DS и ES, а сами сегменты в явном виде определены в программе в виде операторных скобок: имя_сегмента segment ... имя_сегмента ends (версии MS DOS 4.0 и выше допускают более простое указание сегментов в программе: имя_сегмента.).

В программе должно быть указание, какие сегментные регистры закрепляются за используемыми сегментами памяти; при исполнении программы сегментные регистры CS, SS, ES в соответствии с этими указаниями загружаются автоматически.

Сегмент данных DS в EXE-программе не может быть загружен автоматически, поскольку он используется программным загрузчиком для формирования начального адреса служебной области памяти — префикса программного сегмента (PSP), непосредственно предшествующего любой исполняемой программе. Регистр сегмента данных DS должен быть инициирован принудительно — для этого следует в самом начале ASM-программы записать в стек вектор-адрес возврата к служебной области PSP: содержимое регистра DS и нулевое смещение, а затем в регистр DS загрузить адрес сегмента данных. PSP — это группа служебных слов в оперативной памяти, формируемая для каждой загружаемой программы пользователя и занимающая обычно 256 байтов (100h). При запуске программы пользователя в ОЗУ автоматически формируется PSP, и ее начальный адрес помещается в регистр DS.

Обеспечение после завершения выполнения программы возврата к префиксу программного сегмента; проще всего это можно сделать, оформив обращение к исполняемой программе в виде обращения к процедуре (главной процедуре, обязательно с атрибутом far) и поместив в конце программы команду возврата ret (выход из программы можно выполнить также, используя прерывание 20H DOS или функцию 4Ch прерывания 21H DOS, но управление при этом передается не в PSP, а непосредственно в резидентную часть программы COMMAND.COM).

Типовая структура ASM-программы включает в себя:

  1. Имя программы

TITLE prog.ASM

Может присутствовать комментарий назначения программы.

  1. Инициализацию стековой памяти в сегменте стека:

STACKSEG segment stack

DW N dup(?) ; меньше 32 слов в стеке обычно задавать не следует

STACKSEG ends

  1. Инициализацию всех переменных в сегменте данных:

DATASEG segment

; задаются имена всех констант и переменных,

; их начальные значения и резервируется память под них

DATASEG ends

  1. Назначение сегментных регистров в сегменте кодов:

CODESEG segment

Assume CS:codeseg, DS:dataseg, SS:stackseg

  1. Организацию главной программной процедуры far:

MAIN proc far

  1. Запись адреса префикса программного сегмента (PSP) в стек:

push DS

sub AX, AX

push AX

  1. Инициализацию содержимого регистра сегмента данных:

mov AX, dataseg

mov DS, AX

; при указании в команде в качестве операнда символического

; имени сегмента (dataseg) происходит пересылка начального адреса этого сегмента — неверно указывать offset dataseg

  1. Текст программы пользователя в сегменте кодов:

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

  1. Восстановление адреса PSP в DS:

ret

  1. Тексты процедур; если имеются процедуры near, используемые в данной программе, то записываются тексты этих процедур.

  2. Закрытие главной процедуры main, сегмента кодов и выход из программы:

MAIN endp

CODESEG ends

end MAIN

Итак, обобщенная структура программы:

title prog.asm

stackseg segment

; задание поля памяти для стека

stackseg ends

dataseg segment

; задание полей памяти для данных и определение всех констант и переменных

dataseg ends

codeseg segment

assume CS:codeseg, DS:dataseg, SS:stackseg

main proc far

push DX

sub AX, AX

push AX

mov AX, dataseg

mov DS, AX

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

; ...

ret

; тексты ближних процедур

main endp

codeseg ends

end main

В качестве примера рассмотрим программу вычисления квадратного корня..

На рис. 19.2 приводится алгоритм решения задачи.

Рис.19.2. Алгоритм вычисления квадратного корня.