Скачиваний:
23
Добавлен:
11.05.2015
Размер:
998.91 Кб
Скачать

4.3. Компиляция с языка Ассемблера

Ассемблирование — это компиляция программы, написанной на Ассемблере, по особым принципам. Кратко рассмотрим, как происходит этот процесс, на примере трансляции простой программы с языка ассемблера машины PDP-11.

Пусть мы хотим сложить два числа, например, X и Y. Результат занесем в ячейку Z. Для определенности положим, что X=5(8), а Y=7(8). Поскольку машина использует двухадресные команды, необходимо решить, что делать с операндом-приемником, который заменяется на результат операции. Для сохранения Y продублируем эту переменную в ячейку Z.

Начальные значения X и Y запишем в программу, воспользовавшись тем, что метки в языке программирования соответствуют адресу оператора, у которого они установлены. Если оператор состоит только из одной константы, то обращение к метке будет эквивалентно обращению к этой константе.

С учетом выше изложенного напишем программу на некотором машинно-ориентированном языке.

.TITLE PRIMER; Заголовок программы, транслятором не обрабатывается,

MOV Y, Z пересылка переменной Y по адресу Z,

ADD X, Z сложение Z = Z + X,

HALT команда остановки программы,

X: 5 ввод в программу первого числа,

Y: 7 ввод в программу второго числа,

Z: пустая ячейка для записи результата Z,

.END директива конец трансляции.

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

ADD 060000

MOV 010000

HALT 000000

Транслятор анализирует программы слева направо. Первая строка .TITLE PRIMER; не формирует при трансляции машинный код и служит пометкой пользователю о названии программы (но не файла). В листинге программы она будет присутствовать, но никакой команды ей в соответствие поставлено не будет.

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

Y ?

Z ?

В данном ассемблере использование переменных в командах обеспечивается методом адресации с кодом 67. Код оператора формируется логическим сложением кода команды и кодом обращения к операндам, причем для первого операнда Y после КОП он будет 006700, а для второго  000067:

010000 \/ 006700 \/ 000067 = 016767.

Этот код первой команды машина запишет по адресу 000. Далее два слова будут оставлены под обращение к адресам операндов, которые в данный момент транслятору не известны.

Команде сложения ADD транслятор из таблицы постоянных имен возьмет код 060000. Имя переменной X транслятор опять же занесет в таблицу имен пользователя, пометив, что адрес ее не известен. Переменная Z в этой таблице присутствует, но без адреса. Код команды получится в виде:

060000 \/ 006700 \/ 000067 = 066767.

Команда запишется с адреса 006 и займет, опять же, три слова.

Выполнение команды HALT приведет к остановке машины, и программа закончит свою работу. Эта команда будет записана по адресу 010, код команды  000000.

Далее транслятор считает метку X, найдет ее в таблице имен пользователя и поставит в соответствие этому имени адрес метки  012. Аналогично для Y адрес будет 014, а для Z  016. Т.е. после первого прохода транслятора адреса всех переменных оказались определены, но в командах они еще не записаны. При втором проходе транслятора для каждой адресной команды будут определены смещения (в словах) соответствующего операнда по отношению к адресу команды. Так для команды MOV адрес переменной Y оказывается смещенным на 7 шагов программы (необходимо помнить, что при выполнении очередной команды в СчК всегда находится следующий адрес!). Ниже изображен листинг программы.

  1. .TITLE PRIMER;

  2. MOV Y, Z 000 / 016767 000007 000007

  3. ADD X, Z 006 / 066767 000003 000003

  4. HALT 010 / 000000

  5. X: 5 012 / 000005

  6. Y: 7 014 / 000007

  7. Z: 016 / 000000

  8. .END

Резюме:

  • ассемблирование характерно тем, что каждому оператору исходной программы однозначно ставится в соответствие одна команда из набора машинных команд;

  • преобразование программы с языка ассемблера в машинный код производится на основании двух таблиц: таблицы постоянных имен и таблицы имен пользователя.

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

Соседние файлы в папке Введение в вычислительную технику.