- •1 Постановка задачи
- •2 Форматы команд
- •3 Описание метода решения
- •4 Описание структур данных
- •5 Описание алгоритма
- •6 Описание программы
- •6.1 Назначение программы
- •6.2 Требования к программному и техническому обеспечению Программа разработана на языке Java.
- •6.6. Загрузка программы
- •7 Тестирование программы
- •Заключение
- •Литература
Министерство образования науки молодежи и спорта Украины
Севастопольский Национальный Технический Университет
Кафедра кибернетики и вычислительной техники.
Пояснительная записка к курсовому проекту
по дисциплине «Системное программирование»
на тему:
«Разработка транслятора языка Ассемблер»
Вариант №35
Выполнил:
студент группы М-33д
Клочан В.О.
Проверил: Тертычный А.И.
Севастополь
2012
СОДЕРЖАНИЕ
ВВЕДЕНИЕ 3
1 ПОСТАНОВКА ЗАДАЧИ 4
5 ОПИСАНИЕ АЛГОРИТМА 11
6 ОПИСАНИЕ ПРОГРАММЫ 14
6.1 Назначение программы 14
6.2 Требования к программному и техническому обеспечению 15
Программа разработана на языке Java. 15
6.6. Загрузка программы 18
ЗАКЛЮЧЕНИЕ 19
ЛИТЕРАТУРА 20
ВВЕДЕНИЕ
Любая программа, переводящая программу на исходном языке в выходную или объектную программу, называется транслятором. Если исходным языком является Ассемблер, то транслятор тоже часто называют ассемблером.
Язык Ассемблер является машинно-ориентированным языком, другими словами, для разработки ассемблерных программ от программиста требуется знание организации всей системы компьютера: архитектуры, памяти, адресации и т.д.
Транслятор преобразует исходный текст программы в машинный код (объектную программу). Объектная программа либо составляется в абсолютных кодах, либо оформляется в виде одного или нескольких модулей загрузки.
Целью данной работы является приобретение навыков в разработке двухпроходовых трансляторов программ с языка Ассемблера, выявление основных трудностей и проблем возникающих при этом.
1 Постановка задачи
В данной курсовой работе необходимо разработать транслятор для подмножества команд языка Ассемблера IBM PC. Данный транслятор предназначен для перевода текста исходной программы с языка Ассемблер в машинные коды.
Транслятор с языка Ассемблер должен:
- выявить ошибки в исходной программе;
- распределить память;
- перевести на машинный язык команды мнемокода и константы;
- сформировать объектный код программы;
- сформировать протокол трансляции (листинг).
Транслятор должен обрабатывать следующие команды:
MOV Р,Р
MOV Р,НО
MOV Р,ОП( базово-индексная )
MOV ОП( базово-индексная ),Р
SUB Р,Р
SUB Р,НО
SUB Р,ОП( базово-индексная )
SUB ОП( базово-индексная ),Р
SHL Р,1
JA ссылка
INT 20H
Транслятор должен обрабатывать следующие директивы:
- SEGMENT, ENDS, END;
- ORG, OFFSET;
- DB, DW.
Входными данными для транслятора является программа на языке Ассемблер. Результатом работы программы являются два файла – файл-листинг и файл объектного кода.
Объектный код должен иметь следующую структуру:
H запись-заголовок
T тело
E запись-конец
Здесь
запись-заголовок имеет формат:
H<Имя_сегмента><Длина_кода>
запись-тело:
T<адрес_кода><длина_кода><Код>
запись-конец:
E<точка_входа>
Исходная программа имеет следующую структуру:
NAMESEG SEGEMENT
ORG выражение
область команд
NAMEDATA DB
DW
область данных
NAMESEG ENDS
END
Файл-листинг является протоколом трансляции, в котором содержится объектный код и мнемонический код команд, сообщения об ошибках, информация о результатах трансляции. Листинг должен иметь следующий формат:
Номер строки + [ ошибка ] + 16-ричная команда + мнемоника команды + номера регистров [ непосредственный операнд ]
В ходе обработки исходного текста программы, транслятор должен выявлять следующие ошибки:
-
Неверная структура программы
Ссылка на неопределенную переменную или метку
Повторное определение переменной или метки
Неверный формат операнда
Неизвестная команда
2 Форматы команд
Таблица 2.1 Формирование команд
Команда |
Оп1 |
Оп2 |
Байт КОП |
Адресный байт |
Дополнительные байты | ||||
КОП |
d |
w |
mod |
Reg |
r/m | ||||
MOV |
Reg8 |
Reg8 |
100010 |
1 |
0 |
11 |
xxx |
yyy |
|
MOV |
Reg16 |
Reg16 |
100010 |
1 |
1 |
11 |
xxx |
yyy |
|
MOV |
Reg8 |
Reg8 |
100010 |
0 |
0 |
11 |
yyy |
xxx |
|
MOV |
Reg16 |
Reg16 |
100010 |
0 |
1 |
11 |
yyy |
xxx |
|
MOV |
Reg8 |
ОП |
100010 |
1 |
0 |
10 |
xxx |
zzz |
Адрес |
MOV |
Reg16 |
ОП |
100010 |
1 |
1 |
10 |
xxx |
zzz |
Адрес |
MOV |
ОП |
Reg8 |
100010 |
0 |
0 |
10 |
xxx |
zzz |
Адрес |
MOV |
ОП |
Reg16 |
100010 |
0 |
1 |
10 |
xxx |
zzz |
Адрес |
MOV |
Reg8 |
НО |
110001 |
1 |
0 |
11 |
000 |
xxx |
Data8 |
MOV |
Reg16 |
НО |
110001 |
1 |
1 |
11 |
000 |
xxx |
Data16 |
MOV |
Reg8 |
НО |
10110reg |
Data8 |
| ||||
MOV |
Reg16 |
НО |
10111reg |
Data16 |
Data16 | ||||
SUB |
Reg8 |
Reg8 |
001010 |
0 |
0 |
11 |
yyy |
xxx |
|
SUB |
Reg16 |
Reg16 |
001010 |
0 |
1 |
11 |
yyy |
xxx |
|
SUB |
Reg8 |
Reg8 |
001010 |
1 |
0 |
11 |
xxx |
yyy |
|
SUB |
Reg16 |
Reg16 |
001010 |
1 |
1 |
11 |
xxx |
yyy |
|
SUB |
Reg8 |
ОП |
001010 |
0 |
0 |
10 |
xxx |
zzz |
Адрес |
SUB |
Reg16 |
ОП |
001010 |
0 |
1 |
10 |
xxx |
zzz |
Адрес |
SUB |
ОП |
Reg8 |
001010 |
1 |
0 |
10 |
xxx |
zzz |
Адрес |
SUB |
ОП |
Reg16 |
001010 |
1 |
1 |
10 |
xxx |
zzz |
Адрес |
SUB |
Reg8 |
НО |
100000 |
1 |
0 |
11 |
000 |
xxx |
Data8 |
SUB |
Reg16 |
НО |
110001 |
1 |
1 |
11 |
000 |
xxx |
Data16 |
SHL |
Reg8 |
- |
110100 |
0 |
0 |
11 |
010 |
xxx |
|
SHL |
Reg16 |
- |
110100 |
0 |
1 |
11 |
010 |
xxx |
|
JA |
ссылка |
- |
0111 0111 |
Disp8 |
|
Сокращения, используемы в таблице:
xxx – код регистра 1
ууу – код регистра 2
zzz – поле Rm.
Регистры кодируются следующим образом:
Таблица 2.2 Коды регистров
Reg или r/m |
000 |
001 |
010 |
011 |
100 |
101 |
110 |
111 | |
Регистр |
w=0 |
AL |
CL |
DL |
BL |
AH |
CH |
DH |
BH |
w=1 |
AX |
CX |
DX |
BX |
SP |
BP |
SI |
DI |
Поле Rm кодируется в зависимости от используемых регистров:
Таблица 2.2 Кодирование поля Rm
000 |
[BX]+[SI] |
001 |
[BX]+[DI] |
010 |
[BP]+[SI] |
011 |
[BP]+[DI] |
Смещение в адресе будет представлено в виде 2-х байтного числа.