- •Программное управление — основа автоматизации вычислительного процесса
- •2 Состав машинных команд
- •3 Режимы работы компьютеров
- •3.1 Однопрограммные и многопрограммные режимы
- •I.Система прерываний программ в пк
- •3.2 Адресация регистров и ячеек памяти в пк
- •3.3 Относительная адресация
- •II.Стековая адресация
- •4 Основные компоненты языка ассемблер
- •4.1Алфавит языка
- •4.2 Константы (числа и строки)
- •3.4 Элементы программирования на языке ассемблер
- •4.3 Директивы (псевдооператоры)
- •4.4 Модификаторы
- •4.5 Адресация регистров и ячеек памяти в ассемблере
- •4.6 Непосредственная адресация
- •4.7 Прямая адресация регистров мпп
- •4.8 Адресация ячеек оп
- •Основные команды языка ассемблер
- •A.Команды пересылки данных
- •I.Команды сложения, вычитания и сравнения
- •1.Команды приращения
- •A.Команды умножения
- •I.Команды безусловной передачи данных
- •4.9 Команды перехода к подпрограмме и выхода из подпрограммы
- •4.10 Команда перехода к подпрограмме: call opr
- •4.11 Команда выхода из подпрограммы
- •4.12 Команды условной передачи управления
- •4.13 Команды условной передачи управления для беззнаковых данных
- •4.14 Команды условной передачи управления для знаковых данных
- •4.15 Команды условной передачи управления для прочих проверок
- •4.16 Команды управления циклами
- •4.17 Команды прерывания
- •4.18Основные директивы ассемблера
- •4.19 Директивы определения идентификаторов
- •4.20 Директивы определения данных
- •Директивы определения сегментов и процедур
- •4.21 Директивы управления трансляцией
- •5 Краткие сведения о программировании процедур работы с устройствами ввода-вывода
- •5.1 Программирование работы с дисплеем
- •5.2 Видеооперации с прерыванием 10н bios
- •5.3 Видеооперации с прерыванием 21н dos
- •5.4 Программирование работы с клавиатурой
- •5.5 Программирование работы с принтерами
- •5.6 Печатающие устройства параллельного типа
- •5.7 Печатающее устройство последовательного типа
- •5.8 Программирование работы с файлами
- •5.9 Прерывания, используемые при работе с файлами на дисках
- •5.10 Некоторые аспекты создания исполняемых программ
- •5.11 Процедуры формирования программы
- •5.12 Структура исходной программы на языке ассемблера для получения исполняемой программы .Ехе
- •5.13 Основные сведения о листинге и его структуре
- •5.14 Особенности структуры машинных команд
- •5.14 Последовательность работы пк при выполнении программы
- •6 Краткие сведения об отладчике программ debug
- •6.1 Основные команды отладчика debug
5.12 Структура исходной программы на языке ассемблера для получения исполняемой программы .Ехе
Операционная система 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-программы включает в себя:
Имя программы: TITLE prog .ASM, может присутствовать комментарий назначения программы.
Инициализацию стековой памяти в сегменте стека:
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
Текст программы пользователя в сегменте кодов:
основной текст программы
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
