Структура программы на языке ассемблера для создания файла 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-программы включает в себя:
44. Имя программы
TITLE prog.ASM
Может присутствовать комментарий назначения программы.
45. Инициализацию стековой памяти в сегменте стека:
STACKSEG segment stack
DW N dup(?) ; меньше 32 слов в стеке обычно задавать не следует
STACKSEG ends
46. Инициализацию всех переменных в сегменте данных:
DATASEG segment
; задаются имена всех констант и переменных,
; их начальные значения и резервируется память под них
DATASEG ends
47. Назначение сегментных регистров в сегменте кодов:
CODESEG segment
Assume CS:codeseg, DS:dataseg, SS:stackseg
48. Организацию главной программной процедуры far:
MAIN proc far
49. Запись адреса префикса программного сегмента (PSP) в стек:
push DS
sub AX, AX
push AX
50. Инициализацию содержимого регистра сегмента данных:
mov AX, dataseg
mov DS, AX
; при указании в команде в качестве операнда символического
; имени сегмента (dataseg) происходит пересылка начального адреса этого сегмента — неверно указывать offset dataseg
51. Текст программы пользователя в сегменте кодов:
основной текст программы
52. Восстановление адреса PSP в DS:
ret
53. Тексты процедур; если имеются процедуры near, используемые в данной программе, то записываются тексты этих процедур.
54. Закрытие главной процедуры 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. Алгоритм вычисления квадратного корня.
Дата добавления: 2021-09-25; просмотров: 402;