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

             

Таблица мнемокодов.


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

Отметим, что в ПК один и тот же мнемокод в зависимости от типов операндов может заменяться на разные КОПы, поэтому эта таблица представляет собой не просто список пар "мнемокод - КОП", а имеет более сложную структуру, примерно такую:

       мнемокод   тип op1   тип op2     КОП    размер команды

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

         ADD        m16       i16      81 06        6

         ADD        r16       r16       ...         2

           ...

         NEG        r8        -         ...         2

           ...

Эта таблица используется следующим образом. Когда ассемблеру встречается команда, например ADD B,260, то он выделяет из нее мнемокод (ADD) и определяет типы операндов (m16 и i16), после чего отыскивает в таблице строчку с таким мнемокодом и такими типами и берет из нее указанный КОП, который и подставляет в формируемую машинную команду.

Отметим, что эта таблица используется также для проверки правильности записи мнемокодов и для проверки правильности типов операндов. Например, если в предложении встретилось название ADS, то, не найдя такого имени в таблице, ассемблер зафиксирует ошибку. Аналогично будет зафиксирована ошибка в команде ADD B,B, поскольку в таблице нет строки с мнемокодом ADD и типами операндов m16 и m16.

Рассмотрим попутно, как решается проблема с модифицируемыми адресами, например в команде ADD B[BX],260. В машинных командах ПК информация о том, по каким регистрам-модификаторам происходит модификация операнда-адреса, указывается в последних трех разрядах второго байта КОПа (в поле m):

                                   3

          ------------¬  ------------¬

          ¦           ¦  ¦       | m ¦

          L------------  L------------

           L-------- КОП ------------




Например, m= 000b означает, что адрес должен модифицироваться по двум регистрам BX и SI, m=110b - адрес не модифицируется, m=111b - адрес модифицируется по регистру BX и т.д.. Так вот, определив типы операндов команды без учета модификаторов и выбрав из таблицы мнемокодов соответствующий КОП, ассемблер затем просто слегка корректирует этот КОП, настраивая его на нужные модификаторы: в нашем примере с B[BX] код 81 06 (здесь m=110b) надо заменить на 81 07 (m=111b). Поэтому в самой таблице не надо хранить КОПы для всех сочетаний модификаторов, а достаточно хранить только один, так сказать, базовый КОП, отталкиваясь от которого уже просто получить окончательный КОП, учитывающий указанные модификаторы.
В таблице мнемокодов также указывается размер машинных команд, их длина в байтах. Эта информация очень важна для ассемблера на 1-м проходе.
Теперь рассмотрим таблицы, которые ассемблер строит в процессе своей работы и в которых собираются сведения о той программе, которую ассемблер сейчас транслирует. Вначале эти таблицы пусты, а затем по мере просмотра текста программы ассемблер на 1-м проходе заносит в них информацию о тех или иных объектах программы. Это - таблица имен, таблица сегментов и таблица распределения сегментных регистров.

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