АССЕМБЛЕР. Компоновщик. Загрузчик. Макрогенератор


2.4 Построение заголовка загрузочного модуля.


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

В упрощенном виде заголовок ЗМ состоит из следующих разделов:

1) длина программы; 2) точка входа; 3) начало и длина сегмента стека; 4) таблица перемещаемых адресов.

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

Отметим, что абсолютный, адрес (Aабс) любой точки программы можно представить в виде суммы Aабс=Aнач+Aотн, где Aнач - начальный адрес программы, а Aотн - относительный адрес этой точки, т.е. адрес, отсчитанный от начала программы:

             0 ------¬

               ¦     ¦

          Aнач ¦-----¦ ¬     <-- начало программы

               ¦/////¦ ¦ Aотн

          Aабс ¦=====¦ -

               ¦/////¦

Причем компоновщик знает относительный адрес сегмента Aотн

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

 

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

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




Начало  Назад  Вперед



Книжный магазин