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


ASSUME: ASSUME DS:S2, CS:S3, SS:S1 - часть 5


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

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

         X         S2:0               ofs

              X         S2:2               seg

              P         S2:6               segofs

              ...

Здесь "адрес вхождения" - это адрес той ячейки текущего модуля, в которую надо будет затем вставить адрес внешнего имени, указанного в первой колонке. Однако только этой информации мало. Дело в том, что в разных случаях под "адресом внешнего имени" понимаются разные вещи. Например, в директиве DW X (или в команде MOV AL,X) имя X надо заменять на смещение (ofs) этого имени, а в директиве DW SEG X (или в команде MOV AX,SEG X) - на начальный адрес (без последнего 0) того сегмента, где имя описано (на seg). Что касается директивы  DD P (или команды CALL P), то имя P должно заменяться на полный адрес (на адресную пару seg:ofs). На какую именно часть своего полного адреса должно заменяться внешнее имя - отмечается (подходящим образом) в колонке "тип вхождения".

 

 

 

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

Внешние имена - это не единственная вещь, которую ассемблер не может оттранслировать до конца. Как уже сказано, ассемблер не может оттранслировать и имена сегментов. Такие имена надо заменить на начальные адреса сегментов (без последнего 0) в памяти, но эти адреса ассемблер не знает. Они станут известны позже, только перед выполнением программы.

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

Например, для следующего модуля (слева) будет создана такая ТПА (справа):

    S2 SEGMENT DATA                   ТПА:

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

    S2 ENDS                  ------------------------------

    S3 SEGMENT CODE               S2           S3:1

        ASSUME DS:S2,CS:S3               ...

   BEG: MOV AX,S2

        MOV DS,AX

         ...

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

    0: B8 0000

    3: 8E D8

поэтому адрес ячейки, куда надо затем занести начальный адрес сегмента S2, равен S3:1.)

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

 

 




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



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