Читайте также:
|
|
Операционная система MS-DOS предъявляет некоторые обязательные требования к структуре.ASM-программы, предназначенной для последующего создания.ЕХЕ-программы:
- программа может использовать четыре сегмента памяти, начальные адреса которых должны быть загружены в регистры микропроцессора CS, SS, DS и ES, а сами сегменты в явном виде определены в программе в виде операторных скобок: имя_сегмента segment... имя_сегмента ends (версии MS-DOS 4.0 и выше допускают более простое указание сегментов в программе: имя_сегмента.);
- в программе должно быть указание, какие сегментные регистры закрепляются за используемыми сегментами памяти; при исполнении программы сегментные регистры CS, SS, ES в соответствии с этими указаниями загружаются автоматически;
- сегмент данных DS в.ЕХЕ-программе не может быть загружен автоматически, поскольку
он используется программой-загрузчиком (Link) для формирования начального адреса служебной области памяти — префикса программного сегмента (PSP), непосредственно предшествующего любой исполняемой программе. Регистр сегмента данных DS должен быть инициирован принудительно -для этого следует в самом начале исполняемой.ЕХЕ-программы записать в стек вектор-адрес возврата к служебной области PSP: содержимое регистра DS и нулевое смещение, а затем в регистр DS загрузить адрес сегмента данных исполняемой программы. PSP — это группа служебных слов в оперативной памяти, формируемая для каждой загружаемой программы пользователя и занимающая обычно 256 байт (100Н байт). При загрузке программы пользователя в ОЗУ автоматически формируется PSP, и ее начальный адрес записывается в регистр DS;
- обеспечение после завершения выполнения программы возврата к префиксу программного сегмента; проще всего это можно сделать, оформив обращение к исполняемой программе в виде обращения к процедуре (главной процедуре, обязательно с атрибутом far) и поместив в конце программы команду возврата ret (выход из программы можно выполнить также, используя прерывание 20Н DOS или функцию 4 С прерывания 21Н DOS, но управление при этом передается не в PSP, а непосредственно в резидентную часть программы COMMAND.COM).
Типовая структура.ASM-программы включает в себя:
1. Имя программы: TITLE prog.ASM, может присутствовать комментарий назначения программы.
2. Инициализацию стековой памяти в сегменте стека:
STACKSEG segment stack
DW N dup(?); меньше N=32 слов в стеке обычно
; задавать не следует
STACKSEG ends
3. Инициализацию всех переменных в сегменте данных:
DATASEG segment
;задаются имена всех констант и переменных, их;начальные значения и резервируется память под них DATASEG ends
4. Назначение сегментных регистров в сегменте кодов:
CODESEG segment
Assume CS:codeseg, DS:dataseg, SS:stackseg
5. Организацию главной программной процедуры far:
MAIN proc far
6. Запись адреса префикса программного сегмента (PSP) в стек:
push DS
sub AX, AX
push AX
7. Инициализацию содержимого регистра сегмента данных:
mov AX, dataseg
mov DS, AX
;при указании в команде в качестве операнда символического
:имени сегмента (dataseg) происходит пересылка начального адреса этого сегмента
неверно указывать offset dataseg
8. Текст программы пользователя в сегменте кодов:
основной текст программы
9. Восстановление адреса PSP в DS:
ret
10. Тексты используемых процедур; если имеются процедуры nеаг, используемые в данной программе (например, процедуры str2bin или bin2str), то записываются тексты этих процедур.
11. Закрытие главной процедуры 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
В качестве иллюстративного примера для сравнения сложности программ на языке ассемблера с программами на языке высокого уровня ниже приводится без пояснений программа решения этой задачи на языке Basic:
10 print "Расчет сложных процентов"
20 Input "Введите Q, D. N". Q. D. N
30 D1=1+D/100
40 I=1
50 Q=Q*D1
60 print I, Q
70 1=1+1
80 If I<=N then 50
90 end
Дата добавления: 2015-12-07; просмотров: 75 | Нарушение авторских прав