Создан заказ №6180260
4 февраля 2021
Разработка модуля генерации машинных команд для программ с линейной структурой.
Как заказчик описал требования к работе:
Исходные данные: текст, состоящий из двух частей — раздела описания данных и раздела команд на упрощенном языке ассемблера.
Особенность кодового сегмента: линейная последовательность команд пересылки и выполнения арифметических действий БЕЗ использования команд передачи управления.
Формат строк с ин
струкциями: строки содержат только ДВА поля — Имя Команды и один-два операнда (имя регистра, имя области памяти, непосредственная константа)
Задача обработчика: провести разбор каждой строки на отдельные составляющие ( имя команды, операнд(ы)) и выполнить генерацию машинных команд в 16-ричном формате
Основа реализации:
- использование таблицы с именами и кодами операций (Таблица Команд, ТК)
- использование таблицы для преобразования внешних имен регистров во внутренние номера (Таблица Регистров, ТР)
- использование Таблицы Символических Имен (ТСИ), построенной при обработке раздела с данными (практическое задание 1)
- использование переменной СчетчикАдреса (СА) с начальным значением 0
Упрощения базового языка ассемблера.
1. Все элементы данных являются целыми числами длиной ОДИН (db) или ДВА (dw) байта
2. Адреса данных и команд задаются двумя байтами в 16-ричном представлении (0000 - FFFF)
3. Используются только четыре основных РОНа с именами AX, BX, CX, DX (все по 2 байта), каждый разбивается на младший (L) и старший (H) байты, что дает в сумме 12 регистров
4. Для двоичного кода команды используется один байт (первый)
5. Все арифметические операции выполняются только с теми данными, которые находятся в регистрах (НЕ в памяти!)
6. Использование команды перемещения данных MOV имеет следующие упрощения:
- удалена функция загрузки константы в память
- четыре оставшихся варианта команды имеют собственные внутренние коды в Таблице Команд (приведены ниже)
- для операции загрузки константы в регистр вводятся ДВЕ разновидности для различения однобайтовых и двухбайтовых констант
7. Использование команд для арифметических операций имеет следующие упрощения:
- команды сложения и вычитания имеют только по ДВЕ разновидности : (регистр1)+/-(регистр2) и (регистр)+/-(константа), внутренние коды этих команд приведены в ТК
- при использовании операнда-константы аналогично команде MOV введены ДВЕ разновидности для констант разной длины
- команды INC и DEC работают только с регистрами, коды этих команд приведены в ТК
- команда умножения (MUL) выполняет умножение только однобайтовых чисел с получением двухбайтового результата и имеет только ОДИН формат с операндом-регистром
- обработка особых ситуаций при сложении и вычитании НЕ производится.
Структура Таблицы Команд (ТК):
- поле «Символическое Имя Команды»
- поле «Двоичный Код Команды» (код операции)
- поле «Байтовый размер команды»
Имя ком. Двоич. код размер Комментарий для пояснения формата команды
MOV 01 4 операнд1 : регистр (1 байт), операнд2 : память (2 байта)
MOV 02 4 операнд1 : память (2 байта), операнд2 : регистр (1 байт)
MOV 03 3 операнд1 : регистр (1 байт), операнд2 : регистр (1 байт)
MOV 04 3 операнд1 : регистр (1 байт), операнд2 : константа (1 байт)
MOV 05 4 операнд1 : регистр (1 байт), операнд2 : константа (2 байта)
ADD 06 3 операнд1 : регистр (1 байт), операнд2 : регистр (1 байт)
ADD 07 3 операнд1 : регистр (1 байт), операнд2 : константа (1 байт)
ADD 08 4 операнд1 : регистр (1 байт), операнд2 : константа (2 байта)
SUB 09 3 операнд1 : регистр (1 байт), операнд2 : регистр (1 байт)
SUB 0А 3 операнд1 : регистр (1 байт), операнд2 : константа (1 байт)
SUB 0В 4 операнд1 : регистр (1 байт), операнд2 : константа (2 байта)
INC 0C 2 операнд : регистр (1 байт)
DEC 0D 2 операнд : регистр (1 байт)
MUL 0E 2 операнд : регистр (1 байт)
Такое представление машинных команд удобно тем, что код команды однозначно определяет ее операндную структуру и байтовую длину, что упрощает разработку ассемблирующей программы.
Структура Таблицы для преобразования имен регистров в их номера (ТР):
AL AH AX BL BH BX CL CH CX DL DH DX
01 02 03 04 05 06 07 08 09 0A 0B 0C
Использование переменной Счетчик Адреса (СА) для отслеживания адресов, назначаемых командам в процессе последовательной обработки строк раздела команд:
- начальное значение СА = 0000.
- при обработке очередной команды значение СА увеличивается на байтовый размер текущей команды (берется из ТК)
Отслеживание адресов в простейшем случае необходимо для определения байтового размера создаваемого кода.
Алгоритм обработки инструкций.
1. Установить СА = 0;
2. Организовать цикл для обработки строк (выделение имен команд и их операндов)
3. Прочитать очередную строку и выполнить ее разбор
4. Выделить символическое имя команды и выполнить его поиск в ТК:
- если поиск НЕ удачен, то вывести ошибку «Неизвестное имя команды» и завершить разбор
- иначе перейти к разбору операндов
5. Выполнить анализ первого операнда (регистр или память?):
- поиск имени в таблице соответствия, в случае удачи (регистр!) заменить имя номером
- в случае неудачи (а может это память?) выполнить поиск имени в ТСИ:
- если поиск удачен (правильно, память!), то заменить имя адресом из ТСИ
- иначе (и не регистр, и не память) вывести ошибку «Некорректный операнд»
6. Если есть второй операнд, обработать его аналогично, с учетом дополнительной возможности что операнд является числовой константой
7. В зависимости от типа операндов выбрать из ТК необходимый двоичный код команды и добавить к нему двоичное представление операндов
8. Увеличить СА на размер команды (есть в ТК)
9. Сохранить созданный двоичный код команды и перейти к обработке следующей строки
Типовой пример: программа вычисления арифметического выражения вида y = 2*n + m*t
; объявление используемых данных
n db 5
m db 3
t db 10
y dw ?
; объявление команд-инструкций
mov AL, 2
mov BL, n
mul BL
mov CX, AX
mov AL, m
mov BL, t
mul BL
add AX, CX
mov y, AX
Табличное представление процесса генерации кода
А-команда Описание ее обработки результат
mov AL, 2 выделено имя MOV, поиск в ТК удачен,
выделено имя AL, это регистр с номером 01,
второй операнд - однобайтовая константа,
следовательно это 4-ый вид команды с кодом 04 и длиной 3 байта, СА = 0003 04 01 02
mov BL, n выделено имя MOV, поиск в ТК удачен,
выделено имя BL, это регистр с номером 04,
второй операнд - имя области памяти с адресом 0000,
следовательно это 1-ый вид команды с кодом 01 и длиной 4 байта, СА = 0007 01 04 0000
mul BL выделено имя MUL, поиск в ТК удачен,
выделено имя BL, это регистр c номером 04,
код команды 0Е, длина 2 байта, СА=0009 0Е 04
mov СX, AX выделено имя MOV, поиск в ТК удачен,
выделено имя СX, это регистр с номером 09,
второй операнд - регистр с номером 03,
следовательно это 3-ий вид команды с кодом 03 и длиной 3 байта, СА = 000С 03 09 03
mov AL, m выделено имя MOV, поиск в ТК удачен,
выделено имя AL, это регистр с номером 01,
второй операнд - имя области памяти с адресом 0001,
следовательно это 1-ый вид команды с кодом 01 и длиной 4 байта, СА = 0010 01 01 0001
mov BL, t выделено имя MOV, поиск в ТК удачен,
выделено имя BL, это регистр с номером 04,
второй операнд - имя области памяти с адресом 0002,
следовательно это 1-ый вид команды с кодом 01 и длиной 4 байта, СА = 0014 01 04 0002
mul BL аналогично первой команде умножения, СА = 0016 0Е 04
add AX, СX имя ADD есть в ТК,
имя AX определяет регистр 03,
второй операнд определяет регистр 09,
команда имеет код 06 и длину 3 байта, СА = 0019 06 03 09
mov y, AX имя MOV есть в ТК,
имя ‘y’ есть в ТСИ с адресом 0003,
имя AX определяет регистр 03,
код команды 02, длина 4 байта, СА = 001D. Объем кода 1Dh = 29 байт 02 0003 03
подробнее
Заказчик
заплатил
заплатил
200 ₽
Заказчик не использовал рассрочку
Гарантия сервиса
Автор24
Автор24
20 дней
Заказчик принял работу без использования гарантии
5 февраля 2021
Заказ завершен, заказчик получил финальный файл с работой
5
Разработка модуля генерации машинных команд для программ с линейной структурой..docx
2021-02-08 00:06
Последний отзыв студента о бирже Автор24
Общая оценка
5
Положительно
Автор выполнила работу в самые короткие сроки, всем рекомендую !!!! Спасибо за приятный бонус )))))