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


Основная идея ассемблирования.


Ассемблер постоянно находится во внешней памяти. Когда операционной системе (ОС) дан приказ

 MASM M.ASM, M.OBJ, M.LST;

на трансляцию нашей программы, то ОС считывает ассемблер из внешней памяти (из файла MASM.EXE) в оперативную память (ОП) и передает ему управление. Свою работу ассемблер начинает с того, что считывает из внешней памяти (из файла M.ASM) в ОП программу на языке ассемблера (ЯА). Затем он просматривает ее текст строчка за строчкой и постепенно формирует соответствующие машинные коды, которые записывает в другое место ОП. Когда ассемблер полностью построит машинную программу, он записывает ее во внешнюю память (в файл M.OBJ) и на этом заканчивает свою работу (попутно в файл M.LST записывается листинг).

                     -------->-------¬    --------->-------¬

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

    ОП:  ¦программа на ЯА¦       ¦ ассемблер ¦       ¦маш.программа¦

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

                    ­                  ­                  ¯

   внеш.память:   M.ASM             MASM.EXE             M.OBJ

Основная идея перевода с ЯА на машинный язык проста. Надо:

    - заменить мнемонические названия команд на соответствующие цифровые коды операций (КОПы);

    - заменить имена переменных и меток на соответствующие адреса;

    - перевести данные в двоичное машинное представление.



Если, к примеру, имя B обозначает ячейку с адресом 0001, а операция сложения слова из памяти с непосредственным операндом имеет код 81 06 (в ПК коды многих операций занимают два байта), тогда по символьной команде  ADD B,260  ассемблер должен построить следующую машинную команду:

81 06 0001 0104

Как осуществляется такой перевод?

Перевод чисел из 10-й системы счисления в 2-ю осуществляется по хорошо известным алгоритмам.

Замена мнемокодов на цифровые КОПы осуществляется с помощью заранее составленной таблицы, в которой для каждого мнемокода (ADD, MOV, JMP и т.п.) указано, на какой цифровой КОП надо заменять этот мнемокод. Выделив из символьной команды мнемокод, ассемблер отыскивает в этой таблице строчку с данным мнемокодом и берет из нее нужный КОП, который и подставляет в формируемую машинную команду.


Имя переменной ( или метка) должно заменяться на его смещение, т.е. на адрес имени, отсчитанный от начала того сегмента, в котором описано это имя. Для подсчета смещений ассемблер в своей работе использует специальный счетчик размещения (СР), в котором всегда находится смещение первой свободной, еще не занятой ячейки текущего сегмента, т.е. ячейки, куда должна быть помещена очередная машинная команда. При появлении в программе на ЯА нового сегмента СР обнуляется, а затем увеличивается по мере просмотра предложений этого сегмента.

Рассмотрим такой пример:

                    имя адрес   СР

      S SEGMENT                  0

      A DB ?         A <-> 0     1

      B DW ?         B <-> 1     3

      C DD ?         C <-> 3     7

        ...

При появлении директивы SEGMENT отсчет смещений должен начаться от 0, поэтому СР получает значение 0. Далее идет директива DB, описывающая переменную A. Эта переменная размещается с самого начала сегмента, т.е. имеет смещение 0, поэтому имени A ставится в соответствие адрес 0, т.е. текущее значение СР. Переменная A

занимает 1 байт, поэтому СР увеличивается на 1 и имеет значение 1; это значит, что первая свободная ячейка в сегменте имеет адрес 1. С этого места размещается переменная B, поэтому имени B ставится в соответствие адрес 1. Так как на B отводится 2 байта, то СР увеличивается на 2 и теперь имеет значение 3. Именно этот адрес будет поставлен в соответствие имени C из следующей директивы. После этого СР увеличивается на 4, и т.д.

Вот так ассемблер с помощью СР следит за тем, какие ячейки уже заняты, а какие свободны, и с помощью этого СР определяет, какой адрес какому имени соответствует. Эти соответствия запоминаются ассемблером и затем используются для замены имен на адреса.

Такова общая идея перевода с ЯА на машинный язык. Она достаточно проста, но при ее реализации возникает ряд проблем, наиболее важные из которых рассматриваются далее.


Содержание раздела