|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Структура программы на языке ассемблера для создания файла 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. Алгоритм вычисления квадратного корня. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.) |