Главная » Просмотр файлов » Ассемблер. Компоновщик. Загрузчик. Макрогенератор

Ассемблер. Компоновщик. Загрузчик. Макрогенератор (1108377), страница 5

Файл №1108377 Ассемблер. Компоновщик. Загрузчик. Макрогенератор (Ассемблер. Компоновщик. Загрузчик. Макрогенератор) 5 страницаАссемблер. Компоновщик. Загрузчик. Макрогенератор (1108377) страница 52019-04-28СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 5)

│/////│ │ Aотн

Aабс │=====│ ┘

│/////│

Причем компоновщик знает относительный адрес сегмента Aотн (он указан в ОТС) и не знает начальный адрес программы Aнач. Учитывая это, он поступает так: он запоминает только относительный адрес сегмента, чтобы позже, когда станет известным начальный адрес программы, к нему можно было прибавить этот адрес и получить уже настоящий, абсолютный адрес сегмента. Таким образом, все условные адреса компоновщик заменяет на пары Аотн:ofs. Позже ко всем этим относительным адресам будет добавлен начальный адрес программы для получения абсолютных адресов сегментов.

Длина программы.

Эта длина, т.е. число байтов, занимаемых машинным кодом программы, уже была определена компоновщиком при построении ОТС. Она и переносится в заголовок ЗМ. По этой длине затем будет определяться, хватит ли программе места в памяти.

Точка входа.

Это адрес команды, с которой надо начинать выполнение программы. Данный адрес берется из заголовка того ОМ, в котором он указан, и переносится в заголовок ЗМ. (Замечание: если точки входа указаны в нескольких модулях, то учитывается первая их них, а если точка входа вообще не указана, то фиксируется ошибка.)

Начало и длина сегмента стека.

В одном из ОМ программы указывается имя сегмента стека. (Замечание: если стеки указаны в нескольких модулях, то учитывается первый их них, а если стек вообще не указан, то выдается предупреждение.) Компоновщик заменяет имя этого сегмента на его относительный адрес, который он узнает из ОТС. Из этой же таблицы он узнает и длину сегмента, которая также записывает в заголовок ЗМ.

Таблица перемещаемых адресов.

Напомним, что программа пока не оттранслирована до конца - в некоторые ее ячейки еще надо будет записать начальные адреса сегментов программы (без последнего 0). Поскольку эти адреса зависят от места размещения программы в памяти во время ее счета, а это место пока неизвестно, то ассемблер и компоновщик так и не смогли заменить имена сегментов на их адреса. Вместо этого они в своих таблицах перемещаемых адресов (ТПА) запомнили те ячейки, куда затем надо будет записать адреса сегментов. Эти таблицы имеются в каждом ОМ (их составил ассемблер), и есть еще одна таблица, которую составил сам компоновщик при редактировании межмодульных связей. Естественно, компоновщик должен сохранить сведения обо всех таких ячейках, для чего он объединяет все эти таблицы в одну, заменив в них условные адреса сегментов на их относительные адреса. В таком виде таблица и заносится в заголовок ЗМ.

На этом составление заголовка ЗМ закончено. Компоновщик записывает весь ЗМ (заголовок и тело) во внешнюю память (например, в файл M.EXE) и на этом завершает свою работу.

Замечание. Как видно, главная задача компоновщика - объединить машинные коды нескольких ОМ в одну машинную программу и оттранслировать ссылки из одних модулей в другие. Ясно, что если программа состоит из одного модуля, то эти действия не нужны. Но чтобы не было двух схем трансляции (одной для многомодульных программ и другой для одномодульных), одномодульные программы также заставляют "проходить" через компоновщик. В этом случае компоновщик фактически делает только одно - преобразует заголовок единственного модуля из одного формата в другой, тело же модуля при этом не меняется.

3. ЗАГРУЗЧИК.

Итак, компоновщик построил ЗМ и записал его в файл M.EXE. Чтобы выполнить его, нужно дать приказ ОС, состоящий из названия этого файла:

M.EXE или M

Этот приказ ОС трактует как внешний, т.е. ищет на диске файл указанным именем (расширение EXE подразумевается по умолчанию), считывает его в ОП и передает на него управление. Но поскольку, как мы видим, в этом файле находится машинная программа, которая не до конца оттранслирована, то взять и просто считать эту программу в ОП и передать ей управление нельзя. Эту программу еще надо довести "до кондиции". Это замечание справедливо для всех программ, хранящихся в файлах с расширением EXE. Поэтому, если в приказе операционной системе указан файл с расширением EXE, то она вызывает специальную программу, называемую загрузчиком, и передает ей управление, а уже этот загрузчик считывает нашу программу из внешней памяти, доводит ее трансляцию до конца и запускает ее на счет.

Основные задачи загрузчика.

Загрузчик решает следующие основные задачи:

1. Загрузка программы. Загрузчик должен найти место в оперативной памяти для программы и переписать ее сюда с диска.

2. Настройка программы на место (привязка к месту). Загрузчик обязан закончить трансляцию программы в тех ее точках, что зависят от местоположения программы в памяти.

3. Запуск программы на счет. Загрузчик должен записать в определенные регистры соответствующие значения и передать управление на программу.

Рассмотрим, как загрузчик решает эти задачи.

Загрузка программы.

Прежде всего загрузчик определяет место в памяти, где можно разместить программу. Для этого используются возможности ОС: в ее состав входит сервисная процедура, обратившись к которой можно узнать, какое место в памяти сейчас свободно, каковы его размер и начальный адрес. Узнав эту информацию, загрузчик по указанной в заголовке ЗМ длине программы определяет, хватит ли программе места. Если нет, то загрузчик фиксирует ошибку "мало памяти" и возвращает управление ОС - программа в этом случае не выполняется. Если же места достаточно, тогда загрузчик считывает программу (тело ЗМ) в это место.

Настройка программы на место.

Итак, только в этот момент становится известным начальный адрес программы и лишь теперь можно полностью завершить трансляцию программы. Такое завершение трансляции заключается, как говорят, в настройке программы на занимаемое ею место в памяти, в привязке ее к этому месту. Делается это так.

Напомним, что в программе остались недотранслированными имена сегментов: не зная настоящих начальных адреса сегментов, компоновщик запомнил их относительные адреса, т.е. отсчитанные от начала программы, и запомнил адреса ячеек программы, в которые надо затем записать настоящие адреса сегментов. Эта информация хранится в ТПА загрузочного модуля. Теперь же, когда стал известным начальный адрес программы, уже можно получить и абсолютные адреса сегментов. Для этого надо к их относительным адресам добавить начальный адрес. Например, если в ТПА была строка

отн.адрес сегмента отн.адрес вхождения

-------------------------------------

1010 1000:2

и если начальный адрес программы равен 40000h, то загрузчик по адресу сегмента (1010) получает его абсолютный адрес: 40000+1010=41010, затем определяет абсолютный адрес ячейки, в которую надо записать этом адрес, для чего к относительному адресу этой ячейки 1000+2=1002 он прибавляет начальный адрес программы 40000, получая тем самым адрес 41002, и далее записывает в эту ячейку абсолютный адрес сегмента без последнего 0, т.е. величину 4101. Это уже окончательный адрес сегмента, больше его менять не надо.

Вот так загрузчик осуществляет настройку программы на адрес, с которого она разместилась в памяти. Больше в ней ничего менять не надо, она полностью оттранслирована и готова к счету.

Запуск программы на счет.

Теперь осталось только запустить программу на счет. Для этого надо сделать две вещи.

Во-первых, надо загрузить регистры SS и SP так, чтобы они указывали на сегмент стека программы. Делается это просто. Из заголовка ЗМ извлекается относительный адрес этого сегмента, к которому загрузчик прибавляет начальный адрес программы и полученный таким образом настоящий адрес записывает (без последнего 0) в регистр SS. Извлеченная же из заголовка ЗМ длина стека заносится в регистр SP.

Во-вторых, надо записать в регистры CS и IP адрес точки входа в программу. И это делается просто, т.к. этот адрес указан в заголовке ЗМ. Правда, там указан относительный адрес точки входа, но он легко преобразуется в абсолютный адрес добавлением к нему начального адреса программы. Запись же этих величин в данные регистры есть ничто иное, как переход на начальную команду программы.

Итак, загрузчик все, что надо, сделал и передал управление на нашу программу. Теперь она начинает выполняться.

Замечание: в последние годы на лекциях не рассматривается работа макрогенератора, поэтому здесь эта тема опущена.

4. МАКРОГЕНЕРАТОР.

Возможны два варианта взаимодействия макрогенератора (МГ) с ассемблером.

В первом варианте МГ работает до ассемблера и полностью независим от него: МГ вводит текст программы на макроязыке и преобразует его, получая новый текст на "чистом" языке ассемблера (ЯА), и только затем начинает работать ассемблер. В этом случае МГ выступает в роли т.н. препроцессора (препроцессором называют вспомогательную программу, работающую до основной программы и преобразующую исходный текст к виду, удобному для работы основной программы).

Достоинством этого варианта является то, что так легче понять сам макроязык и работу МГ, так легче реализовать МГ и ассемблер. Однако у этого варианта имеются недостатки. Во-первых, приходится дважды просматривать текст программы (а это потери времени), а во-вторых, и это главное, при таком взаимодействии МГ не может использовать информацию, извлекаемую ассемблером из программы. Поясним это на примере.

Пусть программа имеет такой вид:

N EQU 1

...

IF N EQ 1

...

Директива EQU не относится к макроязыку, поэтому МГ не должен ее обрабатывать (это задача ассемблера) и потому он не узнает, что N обозначает константу со значением 1. Директива же IF относится к макроязыку, поэтому МГ должен ее обрабатывать, в частности должен сравнить N с 1, но сделать это он не может, т.к. не знает, что обозначает имя N.

Этот пример показывает, что если МГ работает независимо от ассемблера, то либо надо запретить использование в директивах макроязыка констант и других объектов, смысл которых становится известным позже, при работе ассемблера, либо надо заставить МГ хотя бы частично выполнять работу ассемблера (скажем, обрабатывать директивы EQU). Ясно, что оба этих требования не очень хорошие.

Отмеченные недостатки устраняются при втором варианте взаимодействия МГ с ассемблером - когда текст программы просматривается только раз, но его обрабатывают одновременно (а точнее, чередуясь) и МГ, и ассемблер. Делается это так. Очередное предложение программы сначала просматривает МГ. Если это обычное предложение ЯА (например, директива N EQU 1), тогда МГ ничего с ним не делает, а сразу передает его на обработку ассемблеру. Ассемблер же, обработав это предложение (у нас - записав в таблицу имен, что N - это имя константы со значением 1), возвращает управление МГ, который переходит к следующему предложению программы. Если же очередное предложение программы - это конструкция макроязыка (например, IF N EQ 1), тогда его обработкой занимается сам МГ. В таких случаях МГ либо ничего не сообщает ассемблеру об этом предложении (как в случае директивы IF), либо (если это макрокоманда) генерирует несколько обычных предложений, которые по одному передает на обработку ассемблеру, и только после этого переходит к следующему предложению программы. Ясно, что в данном случае МГ может пользоваться информацией, извлеченной ассемблером из программы; например, в нашем случае МГ может забраться в таблицу имен и узнать, что означает имя N.

Этот второй вариант взаимодействия макрогенератора с ассемблером можно условно изобразить так:

программа на ┌────┐ строка ┌─────────┐

макроязыке ──> │ МГ │ ───────> │ассемблер│ ──> маш.программа

└────┘ на ЯА └─────────┘

└────<────────────┘

Здесь МГ выступает, с точки зрения ассемблера, в роли процедуры ввода строки. Обе эти программы можно рассматривать как части одной программы, которую принято называть макроассемблером.

Именно второй вариант используется в системе MASM, именно его мы и будем придерживаться в рассказе про работу МГ.

4.2 ОБРАБОТКА МАКРОСОВ.

Начнем с обработки макросов.

Прежде всего отметим, что в своей работе МГ использует стек (обычный стек ПК), несколько таблиц (о них будет сказано чуть позже) и несколько счетчиков. Наиболее важные из счетчиков такие:

НС - номер строки исходного текста программы, которую сейчас рассматривает МГ; вначале НС=1.

НОМ - четырехзначный 16-ричный номер, используемый для формирования специмен вида ??номер, на которые при макроподстановках заменяются локальные метки, указанные в директивах LOCAL; вначале НОМ=0000.

УР - уровень вложенности макросов. Пока МГ обрабатывает предложения вне макроопределений, УР равен 0, но когда МГ начинает обработку макроопределения, то он увеличивает этот счетчик на 1, а по выходу из макроопределения уменьшает на 1. Вначале УР=0.

Обработка макроопределений.

Сначала рассмотрим, что делает макрогенератор, когда он встречает макроопределение (МО). Пусть в тексте программы имеется такой фрагмент (слева - номера строк программы):

| ...

10 | M1 MACRO OP,W

11 | LOCAL L

12 | L: OP AX,W

13 | ENDM

14 | M MACRO X,Y,Z

15 | MOV AX,X

16 | M1 ADD,Y

17 | MOV Z,AX

Характеристики

Тип файла
Документ
Размер
224 Kb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6353
Авторов
на СтудИзбе
311
Средний доход
с одного платного файла
Обучение Подробнее