Ассемблеры. Режимы адресации

 

Трудно установить различие между ассемблером и компилятором, но можно сказать, что ассемблеры переводят машинно-ориентированные языки, а компиляторы – проблемно-ориентированные языки в машинные коды. Ассемблер образует программу, команды которой отражают внутреннюю структуру машины.

Существует ряд основных функций, таких как трансляция мнемонических кодов операций в их эквиваленты на машинном языке или присваивание машинных адресов символическим меткам, которые должны выполняться любым ассемблером.

Однако за пределом этого базового уровня возможности, предоставляемые ассемблерами, а также схемы их построения сильно зависят от входного языка, а также языка машины.

Ассемблеры – машинно-ориентированные языки (состоят из мнемокодов-команд процессора).

Одним из аспектов машинной зависимости является имеющиеся различия в форматах машинных команд и кодах операций. С другой стороны некоторые средства языка не имеют прямой связи со структурой компьютера. Их выбор является произвольным и определяется разработчиком языка. Многие Ассемблеры представляют гибкие средства обработки исходной программы и соответствующего ей объектного кода.

Одни из этих средств позволяют располагать сгенерированные машинные команды и данные в объектной программе в порядке, отличном от порядка, в котором расположены соответствующие им исходные предложения.

Другие позволяют создавать несколько независимых частей объектной программы. Каждая из этих частей сохраняет свою индивидуальность и обрабатывается загрузчиком отдельно от других частей.

Для перевода исходной программы в ее объектное преставление необходимо:

1) Преобразовать мнемонические коды операций в их эквиваленты на машинном языке.

2) Преобразовать символические операнды в эквивалентные им машинные адреса.

3) Построить машинные команды в соответствующем формате.

4) Преобразовать константы, заданные в исходной программе во внутренние машинные представления.

5) Записать объектную программу и выдать листинг.

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

Основной задачей первого просмотра является поиск символических имен и назначение им адресов.

Фрагменты программы, содержащие ссылки “вперед” запоминаются во время первого просмотра. Дополнительный просмотр таких заполненных определений выполняются по мере продвижения этого процесса ассемблирования, по завершению этого процесса выполняется обычный 2-й просмотр. Фактическая трансляция выполняется во время второго просмотра.

Ассемблер наряду с трансляцией команд исходной программы должен так же выполнять и директивы Ассемблера. Эти директивы не переводятся непосредственно в машинные коды, а управляют работой самого Ассемблера. В заключительной фазе своей работы Ассемблер должен записать полученный объектный код на некоторые устройства вывода.

Если рассматривать объектный код отдельно то в общем случае невозможно определить какие значения представляют адреса, зависящие от местонахождения программы, а какие – не изменяемые объекты. Поскольку Ассемблеру не известен фактический адрес начала загрузки он не может выполнить необходимую настройку адресов, используемых программой. Однако Ассемблер может указать загрузчику те части объектной программы, которые нуждаются в настройке при загрузке. Объектная программа содержит информацию необходимую для выполнения подобной модификации называется перемещаемой программой.

Не обязательно внутри объектной программы сгенерированные машинные коды и данные должны располагаться в том же порядке, в котором они были в исходном тексте. Многие Ассемблеры предоставляют средства, позволяющие создавать несколько независимых частей объектной программы. Часть программы, которая сохраняет после Ассемблирования свою индивидуальность и может загружаться и перемещаться независимо от других, называется управляющей секцией (УС)

Имена управляющей в одной УС не может непосредственно используются в другой секции, но поскольку управляющие секции образуют связные части программы, то необходимо предоставить средства для связывания их друг с другом. Команда одной управляющей секции должны иметь возможность ссылаться на команды или области данных, расположенные в другой секции. Такие ссылки нельзя обрабатывать обычным образом, поскольку управляющие секции загружаются и перемещаются независимо друг от друга а Ассемблеру ничего не известно о том где будут расположены другие управляющие секции во время выполнения программы такие ссылки между управляющими. Называются внешними ссылками для каждой внешней ссылки Ассемблер генерирует информацию, которая дает возможность загрузчику выполнить требуемые связывание программы. Ассемблер должен запоминать в какой управляющей секции было определено то или иное имя. Любая попытка использовать имя из другой управляющей секции должен отмечаться как ошибка, если это имя не объявлено в качестве внешнего. Ассемблер должен решать использовать одинаковые имена в разных управляющих секциях. Для занесения внешних имен Ассемблер оставляет место в объектном коде. Кроме того он должен включить в объектную программу информацию, позволяющую загрузчику занести необходимые данные куда требуется.

Для этого надо определить 2 типа записей:

- Запись-определение (содержит информацию о внешних именах, определенных в данной управляющей секции)

- Запись–ссылка (содержит список имен, используемых в качестве внешних ссылок)

Большинство Ассемблеров наряду с одиночными терминами разрешается использовать выражения. Выражения классифицируются как абсолютные или относительные, в зависимости к какому типу относятся их значения.

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

Когда в выражении используются внешние ссылки, Ассемблер, в общем случае, не может определить, корректно оно или нет.

Группировка относительных терминов для проверки корректности не может быть сделана, если неизвестно какие термины принадлежат одной из секций. А во время Ассемблирования эта информация отсутствует. В этом случае Ассемблер вычисляет известные ему термины и комбинирует их так, чтобы получить начальное значение выражения. Кроме того, он генерирует записи-модификаторы, позволяющие загрузчику закончить вычисления.

Команды центрального процессора рассматриваются как операционные ресурсы нижнего уровня доступные программисту.

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

Главной особенностью языка ассемблера является использование одного названия операций для всех семантически идентичных действий независимо от форматов и размеров данных.

Форматы данных определяются типом именованных областей памяти или явными указателями.

 

Режимы адресаций можно разделить на 7 групп:

1) регистровая адресация (mov AX,BX) при которой микропроцессор извлекает операнд из регистра и помещает результат в регистр.

2) непосредственная адресация, которая позволяет указывать значение константы в качестве операнда источника mov cx,25h

3) Прямая, при которой исполнительный адрес является составной частью команды. Микропроцессор добавляет этот адрес к содержимому регистра DS и получает 20-битовый физический адрес операнда (mov AX, DAN) DAN – символическое имя, определяемое в сегменте данных.

4) косвенно регистровая, при которой исполнительный адрес содержится в базовом регистре BX, указателе базы BP или индексном регистре SI или DI (mov DI, offset DAN mov AL, [BX]). Косвенные регистровые операнды заключаются в квадратные скобки.

5) адресация по базе (mov AL, [BX]+4) Ассемблер вычисляет исполнительный адрес с помощью сложения содержимого регистров BX или BP, в которые загружается базовый адрес со значением сдвига.

6) прямая адресация с индексированием

(mov DI, 5

mov AL, TABL[DI]) загрузили 6й элемент массива

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

7) адресация по базе с индексированием - адрес высчитывается как сумма значений базового регистра, индексного регистра и сдвига (mov AX,AL[BX][DX]

mov AX,[BX+2+DI]

mov AX, [BX][DI+2])

 









Дата добавления: 2015-07-30; просмотров: 1611;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.007 сек.