ДЗ№11. Ассемблеров. Трансляция
Скачать 89.84 Kb.
|
Домашняя работа Машинные языки и языки ассемблеров. Трансляция Дана вычислительная машина из ДЗ№9 и язык ассемблера из ДЗ№10. Также дан язык ассемблера со следующими командами: Мнемоники Операнды Описание add X – регистр, идентификатор, смещение в памяти относительно начала блока сданными регистр, идентификатор, смещение в памяти относительно начала блока сданными, константа – регистр, идентификатор, смещение в памяти относительно начала блока сданными, константа and Z or X:=Y or Z xor X:=Y xor Z not X – регистр, идентификатор, смещение в памяти относительно начала блока сданными регистр, идентификатор, смещение в памяти относительно начала блока сданными, константа Y neg X:=0 - Y mov X – регистр, идентификатор, смещение в памяти относительно начала блока сданными регистр, идентификатор, смещение в памяти относительно начала блока сданными, константа. Если Y – константа, тов производится запись Y. Иначе в X записывается значение связанное с Y. jmp L - метка Переход пометке Переход пометке, если результат последней арифметической операции равен нулю Переход пометке, если результат последней арифметической операции отрицательный Переход пометке, если результат последней арифметической операции положительный Код обозначенного выше языка делится на две части секция кода, секция данных. В секции кода находятся только вызовы команд и метки перехода. В секции данных находятся значения, которые связаны с символьными обозначениями. Отделение секции кода от секции данных производится вставкой перед секции данных строки data: команда1 команда2 команда3 data: data1 const1 data2 const2 data3 После перевода программы на языке ассемблера в программу из машинных команд в памяти формируются три логические секции секция констант — непрерывный участок памяти, где располагаются все константы, которые используются в секции кода секция данных — непрерывный участок памяти в котором располагаются значения, определённые в секции данных языка ассемблера и заданные в виде смещения в секции кода. Секция команд — непрерывный участок памяти в котором располагаются машинные команды – адрес начала секции констант, N – адрес начала секции данных, K – адрес начала секции команд. Где команда, команда, команда — команды языка ассемблера. data1, data2, data3 – идентификаторы значений (для идентификаторов можно использовать только символы английского алфавита, const1, const2, const3 – значения (в десятичной системе счисления). В секции кода регистры записываются как номер регистра (например $25), номер регистра — целое число от 0 до Идентификаторы значений записываются так как они записаны в секции данных. Константы записываются в десятичной системе счисления. Смещение в памяти записывается как смещение (например #145), смещение — число в десятичной системе счисления, адрес ячейки вычисляется как N + смещение Метки перехода записываются в секции кода на отдельной строке (для создания меток перехода можно использовать только символы английского алфавита. Метки перехода используются в качестве параметров командами перехода, если срабатывает переход пометке, то выполнение программы продолжится со строки после метки перехода по которой был осуществлён переход. Перевод языка ассемблера, определённого в этой домашней работе в язык из ДЗ№10 происходит последующим правилам. Формируются четыре таблицы таблица констант, таблица данных, таблица команд, таблица меток. Таблица констант состоит из двух столбцов — номер ячейки, значение. Код программы последовательно анализируется и все встреченные константы заносятся в таблицу в поле значение, номер ячейки впервой строке имеет значение 0 ив каждой следующей строке увеличивается на 1. 3. Таблица данных состоит из трёх столбцов — номер ячейки, идентификатор, значение. Секция данных программы последовательно анализируется ив поля «идентификатор» и значение заносятся все пары идентификатор-значение. Номер ячейки впервой строке имеет значение 0 ив каждой следующей строке увеличивается на 1. Затем анализируется код программы, из него извлекается наибольшее смещение. Если смещение больше или равно размеру таблицы, то размер таблицы становится равен смещению + 2, иначе размер таблицы увеличивается на 1. 4. Таблица команд состоит из трёх столбцов — команда исходного языка, номер ячейки, команды выходного языка. Код программы анализируется и каждая команда исходного языка преобразуется в команды выходного языка последующим правилам: Команда исходного языка Операнды Команда выходного языка add, sub, and, or, xor, shl, shr, neg, not X, Y, Z – регистры op X Y Z X, Y – регистры – идентификатор, смещение, константа ld Z 1 op X Y 1 X, Z – регистры – идентификатор, смещение, константа ld Y 0 op X 0 Z X– регистры – идентификатор, смещение, константа – идентификатор, смещение, константа ld Y 0 ld Z 1 op X 0 1 X – идентификатор, смещение – идентификатор, смещение, константа – идентификатор, смещение, константа ld Y 0 ld Z 1 op 2 0 1 st X 2 X – идентификатор, ld Z 1 смещение – регистр – идентификатор, смещение, константа op 2 Y 1 st X 2 X – идентификатор, смещение – регистр – регистр op 2 Y Z st X 2 X – идентификатор, смещение – идентификатор, смещение, константа Z – регистр ld Y 0 op 2 0 Z st X 2 jmp, jbt, jz, jlt L – метка Записываются без изменений mov X, Y – регистры st V Y ld V X X – регистр – идентификатор, смещение, константа ld Y X X – идентификатор, смещение – идентификатор, смещение, константа ld Y 0 st X 0 X – идентификатор, смещение – регистр st X Если X, Y или Z является константой, тов третий столбец вместо соответствующего значения подставляется значение номера ячейки, где находится константа впервой таблице. Если X, Y или Z является идентификатором, тов третий столбец вместо соответствующего значения подставляется значение номер ячейки, где находится идентификатор во второй таблице + размер таблицы констант. Если X, Y или Z является смещением, тов третий столбец вместо соответствующего значения подставляется значение смещение + размер таблицы констант. Вместо V подставляется значение размер таблицы констант + размер таблицы данных -Вместо op подставляется соответствующая арифметическая или побитовая операция. Когда команды исходного языка заканчиваются добавляется команда Если встречается метка, то она заносится в четвёртую таблицу, которая состоит из двух столбцов — номер ячейки, метка перехода. Сама метка записывается в поле метка перехода, в поле номер ячейки заносится адрес команды сразу подметкой+ суммарный размер первых двух таблиц После анализа кода программы в команды перехода вместо меток перехода подставляются, соответствующие им в четвёртой таблице, адреса ячеек памяти + размеры первых двух таблиц. Затем три первые таблицы объединяются в одну, которая состоит из двух столбцов адрес и значение. Сначала в таблицу добавляется таблица констант, затем добавляется таблица данных, из которой берётся поле номер ячейки, к каждому значению которого прибавляется размер таблицы констант, и поле значение. Последней добавляется таблица команд из которой берётся поле номер ячейки и команды выходного языка». Полученная программа может размещаться в памяти ВМ начиная с любой ячейки кроме нулевой. Последним шагом нужно ко всем значениям поля адрес прибавить номер первой ячейки программы, во всех командах, где используются номера ячеек прибавить номер первой ячейки программы, а в ячейку 0 вставить команду jmp N, где N – адрес первой команды программы. Пример: loop: add #3 #3 fmult sub smult smult 1 jbt loop mov $4 #3 data: fmult 5 smult На первом шаге нужно составить таблицу констант: Номер ячейки значение В программе в секции кода только одна константа — На втором шаге нужно составить таблицу данных и вычислить размер секции данных программы: Номер ячейки Идентификатор Значение 0 fmult 5 Максимальное смещение в коде программы — 3. Поэтому размер секции данных в программе будет равен 3 + 2 = Наследующем шаге трансляции нужно сформировать таблицы команд и переходов: Команда исходного языка Номер ячейки Команда выходного языка add #3 #3 fmult 0 ld 4 0 1 ld 1 1 2 add 2 0 1 3 st 4 2 sub smult smult 1 4 ld 2 0 5 ld 0 1 6 sub 2 0 1 7 st 2 2 jbt loop 8 jbt loop mov $4 #3 9 ld 4 4 Номер ячейки Метка перехода 0 loop На четвёртом шаге нужно заменить все метки в третьей таблице на адреса и объединить всё в одну таблицу. Адрес Значение 0 1 1 5 2 6 6 ld 4 0 7 ld 1 1 8 add 2 0 1 9 st 4 2 10 ld 2 0 11 ld 0 1 12 sub 2 0 1 13 st 2 2 14 jbt 6 15 ld 4 4 Пусть программа будет размещаться начиная с пятой ячейки, тогда результирующая таблица будет выглядеть так: Адрес Значение 5 1 6 5 7 6 11 ld 9 0 12 ld 6 1 13 add 2 0 1 14 st 9 2 15 ld 7 0 16 ld 5 1 17 sub 2 0 1 18 st 7 2 19 jbt 11 20 ld 9 4 Программа на языке ассемблера из ДЗ№10 будет выглядеть так jmp 11 5 1 6 5 7 6 11 ld 9 0 12 ld 6 1 13 add 2 0 1 14 st 9 2 15 ld 7 0 16 ld 5 1 17 sub 2 0 1 18 st 7 2 19 jbt 11 20 ld 9 4 21 Результирующую программу можно преобразовать в машинные команды потому же принципу как в ДЗ№10. Задание: 1. Реализовать алгоритм вычисления площади трапеции по формуле a +b 2 h на языке ассемблера, описанного в этой домашней работе. Значения a,b,h задавать в секции данных. Двойку передавать как константу в соответствующую операцию. Программу сохранить в файл под именем asmsqr. 2. Перевести программу из п в программу на машинном языке и поместить её начиная с ячейки 8, код записать в файл dump, который идёт вместе с заданием (формат записи и примеры записи можно посмотреть в предыдущей домашней работе. Загрузить два файла в ЭИОС — asmsqr и dump. |