Бройдо В.Л., Ильина О.П. Архитектура ЭВМ и систем (2006) (1186249), страница 85
Текст из файла (страница 85)
О АН = 56)т — переименование файла: в регистровой паре 08:0Х указывается адрес АЗС11Х-строки со старым именем файла, в регистры Е8:0~ заносится адрес АВС112-строки с новым именем файла. Во всех перечисленных случаях при появлении ошибки в выполнении процедуры в регистре»с флаг Ср устанавливается в «1»; код ошибки возвращается в регистре АХ. Ниже приводятся фрагменты программ работы с файлами по АВС11Х-строке: раСЬ бЬ С:тт!епаще.ехС. 0 : А5С117-строка Ьцт ОЬ 1000 бцр(?) ; буфер обмена Ьапб1е бы ? ; логический попер атее бы ? ; разиер файла 385 Программирование работы о файлами воч ЯН.
ЗЕН пач ВХ, Ьапб1е воч СХ. атее пач ОХ, оЛСзеС Ьцт тпС 21Н Зс геаб еггог Закрытие файла: воч ВХ, Ьапб1е пюч ЯН, ЗЕН тпС 21Н Зс с1озе егго г Добавление записей в файл. ; Открытие файла пач ОХ, оССзеС раСЬ воч ЯС. 1 пач ЯН, ЗОН тпС 21Н Зс орел еггог пач Ьапб1е, ЯХ ; Перенещение указателя в конец файла воч ВХ. АХ воч СХ. О воч ОХ, 0 пач ЯС, 2 воч АН, 42Н тпС 21Н Зс ро!пС еггог : Запись в файл ЗОО байт пач ЯН, 40Н пач ВХ.
Ьап61е Полная перезапись файла. : Открытие (создание) файла яач ОХ, оССзеС раСЬ пач СХ, 0 воч ЯН, ЗСН 1пС 21Н Зс орел еггог пач Ьап, АХ : Запись в файл 500 байт яач ЯН, 40Н пач ВХ. Ьапб1е воч СХ. 500 пач ОХ, оССвеС Ьц1 тпС 21Н Зс игтте еггог функция чтения из файла запись логического номера запись размера файла запись адреса буфера обнена выполнение прерывания если СЕ=1. обработка ошибки чтения из файла запись логического нонера функция закрытия файла выполнение прерывания если СЕ=1, обработка ошибни закрытия файла 386 Глава 18. Элементы программирования на языке ассемблера вот СХ, 300 пюч 0Х.
Оттзет Ьцт 1пг 21Н бс нг(се еггог Некоторые аспекты создания исполняемых программ Процедуры формирования программы Последовательность процедур формирования программы показана на рис. 18.1. Иополняемый файл (ехе) Объектный файл (.оь)) Ассемблирование (МДЗМ) За~рузка (ымк) Исходный файл (авгп) Рис. 18.1. Последовательность процедур формирования программы 1. Составление программы и ее ввод под каким-нибудь именем на диск (дискету).
При вводе программы используется любой текстовый редактор, например встроенный редактор )х)отгон Сопппапдег. Язык ассемблера удобен тем, что, с одной стороны, он позволяет писать программы на уровне команд микропроцессора, с другой стороны, не требует использования и, соответственно, запоминания множества числовых кодов этих команд. Исходная программа, составленная на языке ассемблера, использующая мнемонические сокрашения английских слов и введенная в машину с использованием любого текстового редактора (Жогж, Ь)Е, Впе1 Хей, 1.ех)соп и т.
д.), оформляется в виде файла с расширением АЯМ; после обработки исходной программы программой-ассемблером (АЯМ, МАЯМ или ТАЯМ) формируется программа в машинных кодах — объектная программа с расширением ОВ), уже понятная микропроцессору (АЯМ выдает только коды ошибок, обнаруженных при трансляции, а МАЯМ предоставляет более развернутую информацию об этих ошибках; МАЯМ, в отличие от АЯМ, позволяет использовать в программах команды, ориентированные на современные микропроцессоры и сопроцессоры; возможности у ТАЯМ еше несколько шире, чем у МАЯМ, но в настоящее время продолжает развиваться только МАЯМ).
Объектная программа еще не является законченной и исполняемой микропроцессором: в ней окончательно оформлены еще не все адреса (программа является «перемещаемойь) и не объединены части (блоки), оттранслированные отдельно друг от друга (например, с целью более простой их отладки). Преобразование объектной программы в исполняемую (компоновка объектной программы) выполняется редактором связей 1.1Ь)К (либо Т(.1ХК). Исполняемый файл после загрузки имеет расширение ЕХЕ. Отладку исполняемой программы удобно выполнять с помощью отладчика РЕВ()С. Структура программы иа языке ассемблера для получения исполняемого файла 387 2. Трансляция (ассемблирование) программы. При запуске транслятора МАЗМ вводится строка вида МАЗМ с:ргоп.азгп или просто МАЗМ.
Появится запрос: Загсе й1епагпе [.азгп]. Следует указать путь к файлу и имя исходного файла, если оно не было указано ранее. В ответ на запрос ОЬ]ее[ 111епагпе [ргоо.оЬ]] ввести имя объектной программы (объектного модуля), если оно отличается от имени исходного файла (иначе следует нажать клавишу Еп[ег). Если нужен листинг программы в машинных кодах, в ответ на Зоогсе 11з11пп [пц1 1зг] укажите местоположение и имя формируемого файла, иначе — нажмите клавишу Ептег. Для получения листинга перекрестных ссылок программы в ответ на Сгозз-гетегепсе [пи[.сгу] укажите местоположение и имя формируемого файла, иначе — нажмите клавишу Епгег.
Альтернативный вариант вьгзова ассемблера: МАЗМ [с:]ргоп, с:, с:, сс Листинг — распечатка, файл для распечатки; листинг программы содержит программу исходную и в машинных кодах, а также обнаруженные при трансляции ошибки в программе. Листинг перекрестных ссылок показывает имена переменных и номера строк программы, где зги переменные используются. 3. Компоновка объектного модуля (загрузка и редактирование связей). Вводится: 1.1[ЧК с:ргрк.оЬ] или просто 1.1[ЧК. Появится запрос: ОЬ]ее[ гпобо1еа [.оЬ1].
Следует указать имя файла .ОВ], если оно не было указано ранее. Следующий запрос: йоп й1е [ргоп.ехе]; если имя исполняемой программы другое, то следует его ввести, иначе — нажать Епгег. Озг г11е [пй.шар], следует ввести СО[Ч; МАР-файл содержит таблицу имен и информацию о размере сегментов, а также ошибки, обнаруженные при загрузке; ввод СО[Ч означает требование вывода их на экран дисплея.
Запрос ОЬгаг1ез [21Ь]: нажмите Ептег, если при сборке дополнительных библиотек связей не требуется. Альтернативный вариант вызова загрузчика: 1.1[ЧК [с:]ргоп.оЬ], с:, соп. 4. Отладка программы (при необходимости). Можно использовать отладчик РЕВ(]О. Вызов отладчика [)ЕВ[]С: ОЕВ[16 с:ргоп.ехе. 5.
Выполнение программы. При наличии приглашения к работе МЗ [)ОЗ ввести имя программы: с:ргоп[.ехе]. Структура программы на языке ассемблера для получения исполняемого файла формата ЕХЕ Операционная система МЗ [)ОЗ предъявляет некоторые обязательные требования к структуре АЗМ-программы, предназначенной для последующего создания ЕХЕ-файла: 388 Глава тэ. Элементы программирования нв языке ассемблера Сд Программа может использовать четыре сегмента памяти, начальные адреса которых должны быть загружены в регистры микропроцессора С8, 88, 08 и Е8, а сами сегменты в явном виде определены в программе в виде операторных скобок имя сегмента аедптепт,.
имя сегмента епттз (версии М8 О08 4.0 и выше допускают более простое указание сегментов в программе: нмя сегмента). 61 В программе должно быть указание, какие сегментные регистры закрепляются за используемыми сегментами памяти; при исполнении программы сегментные регистры С8, 88, Е8 в соответствии с этими указаниями загружаются автоматически. 12 Сегмент данных 08 в ЕХЕ-программе не может быть загружен автоматически, поскольку он используется программным загрузчиком для формирования начального адреса служебной области памяти — префикса программного сегмента (Р8Р), непосредственно предшествующего любой исполняемой программе ЕХЕ.
Регистр сегмента данных 08 должен быть инициирован принудительно — для этого следует в самом начале А8М-программы записать в стек вектор-адрес возврата к служебной области Р8Р: содержимое регистра 08 и нулевое смещение, а затем в регистр 08 загрузить адрес сегмента данных. Р8Р— это группа служебных слов в оперативной памяти, формируемая для каждой загружаемой программы пользователя и занимающая обычно 256 байтов (100)т). При запуске программы пользователя в ОЗУ автоматически формируется Р8Р, и ее начальный адрес помещается в регистр 08. С3 Обеспечение после завершения выполнения программы возврата к префиксу программного сегмента; проще всего это можно сделать, оформив обращение к исполняемой программе в виде обращения к процедуре (главной процедуре, обязательно с атрибутом 1аг) и поместив в конце программы команду возврата ге1 (выход из программы можно выполнить также, используя прерывание 20Н 1)08 или функцию 4СЬ прерывания 21Н 1)08, но управление при этом передается не в Р8Р, а непосредственно в резидентную часть программы СОММАЬП).СОМ).
Типовая структура АВМ-программы включает в себя: 1. Имя программы: Т1ТСЕ ргод.А5Н Может присутствовать комментарий назначения программы. 2. Инициализацию стековой памяти в сегменте стека: 5ТАСК5Е6 зедюепс в1асК ОЫ й' быр(?) ; неньюе 32 слов в стеке обычно задавать не следует 5ТЯСК5Е6 епоэ 3.
Инициализацию всех переменных в сегменте данных: ОАТА5Е6 зедяеп1 : задаются ииена всех констант и перененных. ; их начальные значения и резервируется память под них ОАТЯ5Е6 епбз 4. Назначение сегментных регистров в сегменте кодов: Структура программы на языке ассемблера для получения исполняемого файла 389 10. 11.
Итак, обобшенная структура программы: гес 5. 6. 7. 8. 9. СООЕ5Е6 зедвепг Аввове С5 собезед. 05 басазед. 55;зсасйзед Организацию главной программной процедуры тат: МЯ!й ргос таг Запись адреса префикса программного сегмента (РБР) в стек: рО5Ь 05 5ОЬ АХ, ЯХ розй АХ Инициализацию содержимого регистра сегмента данных: воч АХ, Оасазед воч 05, АХ . при указании в команде в качестве операнда символического : имени сегмента (басазед) происходит пересылка начального адреса ; этого сегмента — неверно указывать отйвег багазед Текст программы пользователя в сегменте кодов: ;основной текст програииы Восстановление адреса РБР в ЕЗВС гес Тексты процедур; если имеются процедуры пеаг, используемые в данной про- грамме, то записываются тексты этих процедур.