Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Полный текст учебника.docx
Скачиваний:
28
Добавлен:
17.04.2019
Размер:
10.83 Mб
Скачать

Процедуры формирования программы

Последовательность процедур формирования программы показана на рис. 19.1.

Рис. 19.1. Последовательность процедур формирования программы

  • Составление программы и ее ввод и сохранение в виде текстового файла диске). При вводе программы используется текстовый редактор (удобнее использовать редактор, формирующий файлы с расширением .txt, например встроенный редактор FAR Edit или Norton Edit).

  • Трансляция (ассемблирование) программы. При запуске транслятора MASM вводится строка вида:

MASM c:prog.asm или просто MASM

Появится запрос: Surce filename [.asm].

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

В ответ на запрос Object filename [prog.obj] ввести имя объектной программы (объектного модуля), если оно отличается от имени исходного файла (иначе следует нажать клавишу Enter).

Если нужен листинг программы в машинных кодах, в ответ на Source listing [nul.lst] укажите местоположение и имя формируемого файла, иначе нажмите клавишу Enter. Для получения листинга перекрестных ссылок программы в ответ на Cross-reference [nul.crf] укажите местоположение и имя формируемого файла, иначе нажмите клавишу Enter.

Листинг — распечатка, файл для распечатки; листинг программы содержит программу исходную и в машинных кодах, а также обнаруженные при трансляции ошибки в программе. Листинг перекрестных ссылок показывает имена переменных и номера строк программы, где эти переменные используются.

  • Компоновка объектного модуля (загрузка и редактирование связей).

Вводится: LINK c:prog.obj или просто LINK.

Появится запрос: Object modules [.obj]. Следует указать имя файла .OBJ, если оно не было указано ранее.

Следующий запрос: Run file [prog.exe]; если имя исполняемой программы другое, то следует его ввести, иначе Enter.

List file [nul.map], следует нажать клавишу Enter, но если необходима дополнительная информация можно ввести CON; MAP-файл содержит таблицу имен и информацию о размере сегментов, а также ошибки, обнаруженные при загрузке; ввод CON означает требование вывода их на экран дисплея.

Запрос Libraries [.lib]: нажмите Enter, если при сборке дополнительных библиотек связей не требуется.

  • Отладка программы (при необходимости). Можно использовать отладчик DEBUG. Вызов отладчика DEBUG: DEBUG c:prog.exe

  • (в ОС Windows 7. Home.программы DEBUG нет).

  • Выполнение программы.

При наличии в командной строке приглашения к работе ввести имя программы: c:prog[.exe].

Структура программы на языке ассемблера для создания файла 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. Алгоритм вычисления квадратного корня.