Моделирование вычислительной системы. Ассемблерная часть - Программирование, компьютеры и кибернетика курсовая работа

Моделирование вычислительной системы. Ассемблерная часть - Программирование, компьютеры и кибернетика курсовая работа




































Главная

Программирование, компьютеры и кибернетика
Моделирование вычислительной системы. Ассемблерная часть

Разработка транслятора упрощенного языка ассемблера. Преобразование файла в мнемокодах в файл, содержащий объектный двоичный код. Анализ набора команд. Выбор формата ассемблерной команды. Методика определения типа операнда. Формирование строки листинга.


посмотреть текст работы


скачать работу можно здесь


полная информация о работе


весь список подобных работ


Нужна помощь с учёбой? Наши эксперты готовы помочь!
Нажимая на кнопку, вы соглашаетесь с
политикой обработки персональных данных

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Пояснительная записка к курсовому проекту
На тему: ”Моделирование вычислительной системы. Ассемблерная часть”
3. Выбор формата ассемблерной команды
4. Описание входных и выходных данных
8. Отладка и тестирование программы
Ассемблер (от англ. assembler -- сборщик) -- компьютерная программа, компилятор исходного текста программы, написанной на языке ассемблера, в программу на машинном языке.
Как и сам язык (ассемблера), ассемблеры, как правило, специфичны для конкретной архитектуры, операционной системы и варианта синтаксиса языка. Вместе с тем существуют мультиплатформенные или вовсе универсальные (точнее, ограниченно-универсальные, потому что на языке низкого уровня нельзя написать аппаратно-независимые программы) ассемблеры, которые могут работать на разных платформах и операционных системах. Среди последних можно также выделить группу кросс-ассемблеров, способных собирать машинный код и исполняемые модули (файлы) для других архитектур и ОС.
Ассемблирование может быть не первым и не последним этапом на пути получения исполнимого модуля программы. Так, многие компиляторы с языков программирования высокого уровня выдают результат в виде программы на языке ассемблера, которую в дальнейшем обрабатывает ассемблер. Также результатом ассемблирования может быть не исполнимый, а объектный модуль, содержащий разрозненные блоки машинного кода и данных программы, из которого (или из нескольких объектных модулей) в дальнейшем с помощью программы-компоновщика может быть скомпонован исполнимый файл.
В данном курсовом проекте необходимо разработать транслятор упрощенного языка ассемблера. К варианту задания прилагается таблица команд ассемблера и структура ЭВМ.
Объем оперативной памяти . 256 байт. Буферные регистры a и b предназначены для хранения операндов операций. Рабочий регистр Рез используется как регистр результата, полученного при обработке данных в АЛУ.
Команды имеют длину один или два байта. Первый байт определяет код команды в соответствии с таблицей команд (биты 0-3). Следующие 4 бита предназначены для указания номера регистра, коммутируемого к буферному регистру а.
Второй байт используется для задания адреса памяти, где находится второй операнд. Если в качестве второго операнда используется регистр, то его номер хранится в младших 4-х битах второго байта команды, а старшие 4 бита не используются.
Rn:=Rn+Память[Адрес]+ флаг переполнения
Перевод содержимого Rn в дополнительный код
Сравнение содержимого Rn и Память[адрес].
Задание на курсовой проект состоит в написании учебного ассемблера с заданной таблицей команд.
Задачей ассемблера является преобразование файла содержащего программу на языке ассемблера в мнемокодах в файл, содержащий объектный двоичный код. Также необходимо в процессе трансляции создавать файл листинга для отображения результатов в удобной для пользователя форме и файл диагностики, указывающий на ошибки команд.
Данные в курсовом проекте команды можно подразделить на группы: арифметические команды, логические, команды загрузки, перехода, установки и команды обработки программы.
Rn:=Rn+Память[Адрес]+ флаг переполнения
Команды имеют длину один или два байта. Первый байт определяет код команды в соответствии с таблицей команд (старшие 4 бита), а также номер регистра-операнда (младшие 4 бита), указывающего на один из РОПов процессора.
Второй байт определяет адрес операнда в памяти, или задает константу.
Программа должна выполнять преобразование текстового файла в двоичный код (т.е. код команды и код адреса нахождения операнда).
Перевод содержимого Rn в дополнительный код
Сравнение содержимого Rn и Память[адрес].
3. Выбор формата ассемблерной команды
D - строка содержит переменную или константу
E - строка, содержащая оператор завершения работы END
P - строка содержит команду микропроцессора
Положим тип строки X. Если длина массива слов исходной строки равна нулю или "", или начинается с символа ';', то тип строки - C. Если строка начинается словом "DATA", то тип строки - D. Если первое слово строки - "ORG" - тип строки - О, если "END" - E. Если в таблице команд находится мнемоника, эквивалентная первому слову в строке, то тип команды устанавливается равным P. И номер строки в таблице команд, где обнаружилось соответствие, запоминается для дальнейшего определения типа операнда.
При решении данной задачи имеем строку, содержащую мнемонику, эквивалентную одной из мнемоник в таблице команд. Следовательно, известен тип строки - Р и номер строки в таблице команд. А зная строку таблицы команд, можно из неё извлечь тип операнда - строка таблицы команд её содержит в четвёртом слове.
В общем случае, формирование инфопакета - это создание объекта, поля которого - строки листинга, диагностики, бинарная часть - формируются вызовом конструкторов классов ListingLine, DiagLine, BinaryBin с параметрами. Но поскольку существуют нюансы при формировании инфопакета для разных типов строк, то следует описать алгоритм создания инфопакета для каждого типа строки.
В случае строки-комментария необходимо сформировать только строку листинга, которая будет содержать исходную строку, за исключением первого символа - признака комментария. Для этого конструктору класса ListingLine передаётся в качестве параметра номер строки и исходная строка преобразованная методом substring для отделения первого символа. Остальные значения параметров -1 означают отсутствие соответствующих элементов строки листинга. Строка диагностики и бинарная части (поля объекта InfoBag) устанавливаются равными null.
Для строк типа О необходимо формировать строки листинга и диагностики. ORG команда не является командой микропроцессора. Она считается инструкцией ассемблеру. Поэтому бинарная часть инфопакета создается равной 1 байту. Строку диагностики для строк типа О необходимо формировать потому, что ORG команда содержит операнд, в котором возможна ошибка.
Для формирования строки листинга необходимо решить задачу поиска адреса из операнда. Если результат будет положительным ( в прямом смысле этого слова, если результат будет значением адреса), то строка листинга в данном случае формируется следующим образом: номер строки, значение операнда, исходная строка. В противном случае, если результат решения задачи поиска отрицательный(тип ошибки), то строка листинга формируется как номер строки + символ ошибки "-" + исходная строка. Строка диагностики формируется следующим образом: номер строки, исходная строка, символ перехода на новую строку и краткое описание типа ошибки.
Строки, хранящие данные, должны формировать "строку" бинарного файла и листинг. В случае ошибки в записи операнда, так же должен формироваться файл диагностики. Значение константы в данной задаче находится так же, как и адрес - решается задача поиска(выделения) адреса из операнда. Строка листинга формируется следующим образом: номер строки, первый байт, второй байт, исходная строка. Конструктору бинарной части инфопакета передается следующая информация: длина команды - 2, адрес команды, первый байт, второй байт. В случае ошибки в адресе операнда (поиск адреса в операнде выдал отрицательный результат), формируется следующая строка листинга: номер строки, символ ошибки, исходная строка. Бинарная часть инфопакета устанавливается равной null.
Строкой типа E может являться одна единственная команда - команда END. Она не является командой микропроцессора, но бинарная часть будет равна 1 байту - FF. Команда END не содержит операндов, поэтому формирования строки диагностики на этом этапе так же происходить не будет. Строка листинга формируется просто как номер строки + исходная строка.
Тип строки P, тип операнда Z (метод parseZ)
Команды типа Р с типом операнда Z - это однобайтовые команды, старшие четыре разряда содержат код команды, остальные разряды нулевые.
Значение первого байта равно двоичному коду мнемокоманды, смещённому на четыре разряда влево.
Двоичный код мнемокоманды берётся из соответствующей строки таблицы команд. Соответствие устанавливается ранее, при поиске соответствия первого слова строки мнемокоду команды из таблицы команд.
Строка листинга: номер строки, адрес команды, первый байт, исходная строка. Бинарная часть: длина команды - 1, признак команды, первый байт.
Формирование строки диагностики на данном этапе не нужно, поскольку операнд в командах типа Z отсутствует. Команды типа Р с типом операнда R - это однобайтовые команды, старшие четыре разряда которого - код команды, младшие четыре разряда байта - регистр.
Тип строки P, тип операнда R (метод parseR)
Байт-код, соответствующий мнемонике в строке и взятый из таблицы команд в соответствующей строке сдвигается на четыре разряда влево, а младшие четыре разряда заполняются регистром. Таким образом формируется байт команды.
Строка листинга: номер строки, адрес команды, байт команды, исходная строка. Бинарная часть: длина команды - 1, признак команды, байт команды.
В случае отрицательного значения операнда (ошибка в записи операнда), строка листинга формируется следующим образом: номер строки, адрес команды, символ ошибки, исходная строка. Строка диагностики: адрес команды, исходная строка, символ перехода на новую строку, краткое описание типа ошибки.
Тип строки P, тип операнда RА (метод parseRА)
Команды типа Р с типом операнда RА - двухбайтовые команды. Поскольку длина самой команды - четыре бита, а длина операнда - четыре бита, то необходимо использовать минимум два байта для записи такой команды. Распределим информацию в байтах таким образом: старшие четыре разряда первого байта - бинарный код команды, младшие четыре разряда первого байта - первый операнд, второй байт - операнд адрес.
Первые байт формируется точно так же, как и в случае типа операнда R. Значение второго байта заполняется адресом. Строка листинга: номер строки, адрес команды, первый байт, второй байт, исходная строка. Бинарная "строка": длина команды - 2, признак команды, первый байт, второй байт.
Для данного типа строки возможны две ошибки - ошибка в первом операнде и ошибка во втором операнде. Если значение операнда отрицательно, формируется строка диагностики: "Первый"/"Второй" +" операнд:" + краткое описание типа ошибки.
Тип строки P, тип операнда A (метод parseA)
Строки типа Р с типом операнда A являются двухбайтовыми командами. Старшие четыре разряда, как и в остальных командах типа Р, содержат байт-код команды, младшие четыре разряда будут являться нулями. Остальные восемь разрядов операнда адреса будут храниться во втором байте.
Первый байт формируется как и в предыдущих случаях - поразрядным сдвигом байт-кода команды на четыре. Строка листинга формируется следующим образом: номер строки, адрес команды, первый байт, второй байт, исходная строка. Бинарная "строка": Длина команды - 2, первый байт, второй байт.
В случае, если допущена ошибка в записи операнда, формируется строка листинга: номер строки, признак ошибки и исходная строка. Строка диагностики: номер строки, исходная строка, символ перехода на новую и краткое описание типа ошибки. Бинарная часть инфопакета - null.
Задача поиска адреса должна давать следующие результаты: если операнд написан верно - его значение, если не верно - код ошибки (отрицательное число).
Методу в качестве параметров передаётся слово-операнд из исходной строки и шаблон записи адреса. Если переданное слово пусто (null, или длина слова равна 0), то результат -3(операнд отсутствует). Если слово не удовлетворяет шаблону, то результат равен -1 (номер ошибки, соответствующий неверной мнемонике). Если слово удовлетворяет шаблону, производится идентификация кода - считывание признака системы счисления. Если на этапе преобразования возникнет исключение (Exception), то результатом будет -2(неверно задан регист(адрес)). Если ошибки не возникло, метод возвращает значение операнда.
Алгоритм поиска(выделения) регистра
Задача аналогичная задаче поиска адреса за исключением положения, касающегося непосредственно поиска значения регистра. Значения регистров лежат в интервале от 0 до 15. из исходной строки выделяется непосредственно значение регистра, и если он задан числом - возвращается это число. Принцип формирования ошибок типа -1 и -3 аналогичен принципу в задаче поиска адреса. Формирование ошибки типа два происходит в случае, если операнд не является числом 0-15.
Попробуем описать алгоритм работы программы опустившись до уровня решения подзадач.
Первым шагом алгоритма является создание потоков считывания и записи. Далее считывается строка если она не равна нулю, выполняется её обработка: решается задача определения типа строки. Если тип строки C, O, D, E - решается задача формирования инфопакета для соответствующего типа строки. Если тип строки P - находится тип операнда команды и решается соответствующая задача формирования инфопакета. Сформированные строки инфопакета выводятся в соответствующие файлы. Считывается следующая строка. И так до тех пор, пока не будет обработана строка типа E или строка не будет пустой (конец текстового файла). Потоки считывания и записи закрываются.
4. Описание входных и выходных данных
Текстовый файл, содержащий программу на ассемблере. Команды в программе имеют длину 1 или 2 байта. Биты 4-7 первого байта содержат код команды в соответствии с таблицей команд. Биты 0-3 и второй байт используются для задания адреса памяти, где находится константа или операнд.
Все операции производятся над операндами, находящимися в памяти или стеке. Результат может быть сохранен в памяти или стеке. Каждая строка должна содержать не более одной команды. Мнемокод отделяется от операнда последовательностью пробелов. Таблица допустимых команд:
В программе имеет значение регистр символа - он обязательно должен быть верхним.
Программа должна выполнять преобразование текстового файла в двоичный код (т.е. код команды и код адреса нахождения операнда).
При выполнении программы формируются 3 файла:
1. Бинарный файл, который получается в результате трансляции команд данного текстового файла;
2. Текстовый файл - файл-листинг, который содержит исходный текст, его кодировку и результаты трансляции.
3. Файл диагностики. В этот файл выводятся сообщения об ошибках трансляции:
При выявлении ошибки формирование объектного файла невозможно и выполнение программы прекращается, а в файле диагностики выводится описание ошибки.
В результате ассемблирования может возникнуть ряд ошибок:
-Неверные разделители(Отличный от запятой при разделении операндов, от пробела или Таb, при разделении мнемоники и операнда или операндов)
-Неверная мнемоника команды, или её отсутствие
Программа имеет некоторые ограничения:-в каждой строке записывается только одна команда процессора;
-команда содержит мнемонику операции, за мнемоникой следуют операнды;
-после операндов можно расположить комментарий
-если операнды есть, между мнемоникой и операндами должен быть по крайней мере один пробел;
-комментарий начинается знаком «;», или отделяется пробелом;
Является главным классом программы. Содержит инициализацию таблицы команд процессора, записи операндов-регистров и операндов-адресов, констант, потоков считывания и записи, переменной адреса команды acom. Имеет главный метод main, который нужно выполнить, чтобы запустить программу.
В качестве потока считывания исходного текста src.txt используется класс BufferedReader (FileReader). Для потоков записи файлов листинга и диагностики используется класс PrintWriter. Для формирования бинарного файла используется класс RandomAccessFile.
Массив String[] PRCOMTAB формируется в соответствии с таблицей команд процессора. Каждому элементу массива соответствует команда из таблицы команд. Команды не повторяются, каждая команда имеет уникальный мнемокод и двоичный код. Формат строки массива PRCOMTAB: мнемокод, двоичный код, длина команды, тип команды, тип операнда. Каждый элемент в строке должен быть отделён от соседнего пробелом.
Инициализация шаблонов записи операндов-адресов и операндов-регистров. Операнд адрес - это слово, которое в случае двоичного кода может иметь не более 8-ми битов. Может содержать любые символы шестнадцатеричной системы счисления (0-15) и обязательно заканчиваться на один из символов h,H.
Операнд-регистр - длиной не менее и не более трех символов .Первый символ - признак регистра, второй и третий символ - номер регистра. Для 16 регистров достаточно двух символов, чтобы указать каждый регистр. Регистр должен удовлетворять такому регулярному выражению: "^[Rr](([0-9])|([1][0-5]))$". Это значит что регистр должен начинаться с символов R или r и заканчиваться цифрой от 0 до 15.
Метод main(String[] args) Является главным исполняемым методом. Создаёт потоки считывания и записи, производит считывание строк, вызывает метод обработки строки parseLine и выполняет вывод инфопакета, сформированного в процессе обработки строки, в файлы листинга и диагностики. После считывания строки, формирования инфопакета и вывода строки диагностики, в зависимости от типа строки lineType, выполняет следующие действия: если тип строки О (ORG-адрес) - устанавливает значение acom, равное значению адреса, хранящемуся в сформированном инфопакете, в его бинарной части; если тип команды D (DATA) - записывает в бинарный файл адрес команды, выводит значение первого и второго байта, увеличивает acom на bincom.len (длину команды); P ( команда процессора) - выводит адрес команды, значение первого байта, и если команда двухбайтовая - выводит второй байт. Весь текст метода, начиная с считывания строки заключен в блок try, и в случае возникновения исключения, все потоки будут закрыты, а выполнение программы остановлено.
Содержит основные методы обработки исходной строки: parseLine, parseComment, setOrg, setData, setEnd, parseRА, parseA, parseR, parseZ; а так же вспомогательные: setAddrValue, setRegValue, findCom. Основные методы в качестве результата возвращающают инфопакет, вспомогательные - формируют результаты вычисления подфункций.
String sourceLine - исходная строка, формируется конструктором - считывается из файла Src.txt.
String myLine - исходная строка без пробелов слева и справа.
String[] words - части строки - слова.
int nProc - номер команды в таблице команд микроЭВМ
В качестве параметра методу передаётся исходная строка. Метод формирует инфопакет, бинарная и диагностическая части которого равну null. Строка листинга формируется следующим образом - конструктору ListingLine передается следующий набор параметров : (-1, -1, -1, -1, " ", line.substring(1,line.length())). Последний параметр - это строка без первого символа, т.е. без символа ";".
В качестве результата метод возвращает сформированный инфопакет.
Метод определяет тип строки (X,C,O,D,E,P). Переменной lineType, в результате выполнения метода присваивается одно из этих значений в зависимости от содержания исходной строки.
Определив тип строки, метод приступает к обработке этой строки. Если тип строки C, то выполняется метод parseComment(), который формирует объект InfoBag в соответствии с типом строки C. Если тип строки O, выполняется метод setOrg(). Строку типа Е будет обрабатывать метод setEnd(). Строки типа D будет обрабатывать метод setData().
В случае, если строка имеет тип P, переменной kod присваивается значение двоичного кода этой команды и в переменную format записывается 4-ое поле PRCOMTAB - формат команды (RA,R,A,Z). Каждому формату команды соответствует свой метод обработки строки. Для строки RA будет выполняться метод parserRA, для R - parseR. Для данной структуры метод parseRA не нужен. Но т.к. PRCOMTAB содержит команды формата A, необходимо определить метод parseA().
В случае, если тип строки X, формируется инфопакет ошибки.
Метод findCom(String w, String[] com)
findCom является вспомогательным служебным методом. Методу в качестве параметров передаётся строка w (первое "слово" исходной строки) и массив строк com (таблица мнемоник команд). Прямым поиском сравнивается w и элементы массива com. В качестве результата метод возвращает значение номера элемента массива com, которому соответствует w. Если такого соответствия не обнаружено, метод возвращает -1.
Метод setRegValue(String w, Pattern pr)
Так же является вспомогательным методом.
Методу в качестве параметра передается "слово" w, содержащее операнд регистр, вида R1 или r14. Метод проверяет длину строки w на наличие в нём символов (операнда). Если символов нет, переменной val присваивается значение -3, и при дальнейшей проверке этой переменной формируется инфопакет ошибки. Если строка w не удовлетворяет правилам записи строки, хранящиеся в Pattern pr, значение val устанавливается равным -2, что означает ошибку с кодом -2, т.е. неверная мнемоника.
Если значение слова больше нуля, и слово удовлетворяет правилам записи операнда-регистра, выполняется следующее: в переменную val записывается значение w, переведённое из той системы счисления, которое указано конечным символом слова w. Метод возвращает значение val.Если меньше возвращает -3.
Метод setAddrValue(String w, Pattern pr) повторяет метод setRegValue.
В качестве параметра методу передается массив слов исходной строки. Метод формирует инфопакет. Строка листинга инфопакета формируется конструктором ListingLine с набором параметров (lineNumber, Asm.acom, av, -1," ", sourceLine). Строка бинарного файла создается c 1 байтом.
В качестве параметра методу передается массив слов исходной строки. Метод формирует инфопакет. Строка листинга инфопакета формируется конструктором ListingLine с набором параметров ( lineNumber, Asm.acom, av, -1, " ", sourceLine ). Строка бинарного файла создается c 1 байтом. Метод setEnd( ) возвращает инфопакет со строкой листинга, строкой бинарного файла с 1 байтом. Метод parseZ(String[] ops, int bk) Метод возвращает инфопакет, содержащий информацию об обработке команды типа Z (команда типа Z - строка, не содержащая операндов).
В случае адекватных данных метод присваивает значению k, значение двоичного представления команды, которое передаётся ему в качестве параметра bk. Метод выполняет операцию поразрядного сдвига на четыре влево.
Почти аналогичен методу parseZ, за одним исключением. После формирования переменной k, равной bk и операции сдвига влево на четыре разряда, к переменной применяется операция порязрядного сложения переменной rv, значение которой устанавливается методом setRegValue(ops[1], Asm.pReg).
Конструктору бинарной строки передает один, первый байт.
Обрабатывает строку типа A. Строка типа А содержит команду операнд-адрес. Метод формирует переменную k так же, как и метод parseZ, только значением второго байта берет av, предварительно сформированное методом setAddrValue(ops[1], Asm.pAddr). Команды типа A - двухбайтовые.
Метод parseRA(String[] ops, int bk)
Метод формирует первый байт так же, как и метод parseR, а значение второго байта устанавливается равным av = setAddrValue(ops[2],Asm.pAddr). Получается, в командах типа RA старшие четыре бита - команда, затем младшие четыре разряда первого байта - первый регистр, а значение второго байта - адрес.
В качестве результата возвращается сформированный инфопакет.
Класс, отвечающий за создание и формирование пакета как объекта. Класс имеет следующие поля: char lineType, ListingLine listline DiagLine diagline, BinCom bincom. Поля этого класса являются объектами классов ListingLine, DiagLine, BinCom.
Класс имеет конструктор с параметрами InfoBag (ListingLine listline, DiagLine diagline, BinCom bincom). Передаваемые объекты конструктор соответственно записывает в поля объекта, тем самым формируя инфопакет с заданными в параметрах данными.
Класс отвечает за строку листинга инфопакета. Класс содержит следующие поля: String lineNo - номер строки, String comAddress - адрес размещения команды, String byteOne - первый байт комады, String byteTwo - второй байт команды, errMark - метка ошибки, String srcLine - копия исходной строки.
Имеет конструктор без параметров, который инициализирует объект с пустыми значениями полей класса.
Так же имеет конструктор с параметрами ListingLine( int lno, int ad, int k1, int k2, String err, String line). Полю lineNo присваивается значение lno, с использованием формата: действительное число с четырьмя знаками. Если параметр ad<0, полю comAddress присваивается значение " ххх ". В противном случае в переменную comAddress записывается отформатированное значение ad. Далее, если значение переменных k1 и k2 больше нуля, то переменные byteOne и byteTwo заполняются этими значениями соответственно. Если длина какого-то параметра будет меньше нуля, то соответственное поле заполнится “xx ” строкой. Значение поля errMark устанавливается равным первому символу строки err, передаваемой в качестве параметра. Переменной srcLine присваивается значение переменной line.
Класс содержит перегруженный метод toString, который формирует и возвращает String-представление объекта класса ListingLine. Метод возвращает строку, состоящую из последовательно соединенных полей объекта.
Класс отвечает за формирование байтов бинарного файла. Класс имеет поля int len - длина команды в байтах, int addr - адрес первого байта команды в памяти, byte1, byte2 - первый и второй байты команды, int p - признак команды, или директива
Класс содержит конструктор без параметров BinCom() и конструктор с параметрами (int l, int pd, int a, byte b1, byte b2). Параметры последнего конструктора записываются в соответствующие поля объекта, тем самым создавая объект с заданными параметрами.
Класс, описывающий строку диагностики инфопакета.
Класс инициализирует статический массив строк-ошибок ErrorMess[]. Имеет одно единственное поле: String Line.
В классе существует два конструктора - пустой DiagLine() и с параметрами DiagLine (int ln, String msg). Передаваемые параметры в соответствии с форматом ("%03d", ln) записываются в поле line.
В классе определён перегруженный метод toString, возвращающий String-представление объекта класса DiagLine. В качестве результата метод возвращает строку line.
8. Отладка и тестирования программы
В качестве тестовых примеров будет предложена совокупность команд - текстовый файл, содержащий программу на ассемблере - которая содержит допустимые записи каждой команды таблицы ассемблера, а так же некоторые заведомо неверные записи команд. Ошибка так же будет находиться во всевозможных местах - мнемонике команды, операнде-регистре, операнде-адресе, операнде константе. Тестовая программа не является реально решаемой задачей. Она содержит совокупность всевозможных записей команд для отладки программы.
8.1 Исходные данные ( файл Src.txt)
5 016 1f хх NOTR R15,29H;один два три
Первый операнд: неправильно задан регистр(адрес)
Второй операнд: неправильно задан регистр(адрес)
8.4 Файл с объектным двоичным кодом(binary.bin)
Данная последовательность команд проверяет правильность работы всех ветвей программы, связанных с обработкой правильных команд (методы parseLine, parseR, parseZ, parseRA, parseA, setAddrValue, setRegValue, findCom класса SourceLine, а так же классы InfoBag, ListingLine, DiagLine, BinCom и Asm).
В ходе курсовой работы были освоены навыки работы с ассемблером, а так же укреплены усвоенные навыки программирования. Была разработана программа-ассемблер, которая переводит мнемокод в объектный код.
1. Ноутон П. Java 2: [пер. с англ.]/П.Ноутон, Г.Шилдт. - СПб.: БХВ-Петербург, 2014. - 1072 с.
static int acom = 0; //адрес команды
static BufferedReader src = null; //поток для исходной программы
static PrintWriter list = null; //поток для листинга
static PrintWriter diag = null; //поток для диагностики
static RandomAccessFile bin = null; //поток для двоичных команд
static Pattern pAddr; //скомпилированное рег.выр. для адреса
static Pattern pReg; //скомпилированное рег.выр. для регистра
static String[ ] PRCOMTAB = { //команды микроЭВМ
static String[ ] prCom; //мнемоника команд микроЭВМ -1-й столбец табл. 1
static { //статический инициализатор таблицы prCom
pAddr = Pattern.compile ( "^[0-9a-fA-F]{1,2}[hH]$" );
pReg = Pattern.compile ( "^[Rr](([0-9])|([1][0-5]))$" );
prCom = new String[PRCOMTAB.length];
for (int i = 0; i < PRCOMTAB.length; i++) {
prCom[i] = PRCOMTAB[i].substring(0, PRCOMTAB [ i ].indexOf(' '));
public static void main(String[ ] args) throws IOException {
String srcFile = "Src.txt"; //исходная программа
String listFile = "List.txt"; //листинг
String binFile = "binary.bin"; //двоичный код
String diagFile = "Diag.txt"; //диагностика
String line; //строка исходного файла
try { //если файлы нельзя открыть - исключение и окончание работы
src = new BufferedReader(new FileReader(srcFile));
bin = new RandomAccessFile(binFile, "rw");
while (( line = src.readLine()) != null ) { num++; //прочли строку
infobag = sl.parseLine(sl.words); //обработка строки
case 'O': Asm.acom = infobag.bincom.addr;
bin.writeByte ( infobag.bincom.p );
bin.writeByte ( infobag.bincom.addr ); break;
case 'D': bin.writeByte ( infobag.bincom.p );
bin.writeByte (infobag.bincom.byte1);
Asm.acom+= infobag.bincom.len; break;
case 'P': bin.writeByte ( infobag.bincom.p );
bin.writeByte ( infobag.bincom.byte1 );
if (infobag.bincom.len == 2) { //если требуется второй байт
bin.writeByte ( infobag.bincom.p );
bin.writeByte ( infobag.bincom.byte2 );
Asm.acom+= infobag.bincom.len; break;
case 'E': bin.writeByte ( infobag.bincom.p );
if ( src != null) { src.close ( ); }
if ( list != null) { list.close ( ); }
if ( diag != null) { diag.close ( ); }
public class SourceLine { // Класс : строка исходной программы
String sourceLine; //исходная строка, заполняется конструктором
String myLine; //исходная строка без пробелов слева и справа
String[ ] words; //части строки - слова
char lineType; //C-комментарий, A,O,D,E-команды ассемблера,
//P-команда процессора, X - неизвестный тип
int nAsm; //номер команды в таблице команд ассемблера
int nProc; //номер команды в таблице команд микроЭВМ
public SourceLine(String l, int n) { // конструктор
sourceLine = new String(l); // Задается сама строка
myLine = sourceLine.trim(); // удаляются пробелы слева и справа,
w
Моделирование вычислительной системы. Ассемблерная часть курсовая работа. Программирование, компьютеры и кибернетика.
Реферат: Ethics And ABortion Essay Research Paper Nicole
Формы И Виды Облачности Реферат
Реферат На Тему Самостоятельная Работа Студента
Итоговое Сочинение Изложение 2022 2022 Дата
Реферат по теме Игровые манипуляторы
Курсовая работа: Мировая экономика и процесс глобализации
Реферат по теме Микроскопия вчера, сегодня, завтра
Контрольная Работа По Теме Конус 11 Класс
Реферат: Маркетинг американского профессионального спорта
Реферат по теме Воспитание и обучение детей в системе дополнительного образования (секция шахмат)
Эссе по теме Тридентский собор: реакция или обновление?
Реферат: Новейшая история Индонезии
Я Хочу Жить Сочинение
Реферат: Концепция культурного полицентризма Н.Данилевского. Геополитика К.Хаусхофера. Географический дет
Дипломная работа по теме Использование ГИС технологий для оценки загрязнения окружающей среды на примере г. Ялта
Поведение Фирмы В Краткосрочном Периоде Реферат
Контрольная работа по теме Производные и международные ценные бумаги
Реферат На Тему Культурологические Концепции Второй Половины Xix И Xx Веков
Реферат по теме Инвентарь русского мира в путевых заметках Т. Готье
Курсовая работа по теме Расчет экономической эффективности внедрения новых служб
Просветительские реформы Петра I. Педагогические взгляды, деятельность и наследие М.В. Ломоносова (1711 – 1765) - История и исторические личности реферат
Роль самостоятельной работы учащихся при формировании у них навыков табличного умножения и соответствующих случаев деления на уроках математики - Педагогика курсовая работа
Возмещение вреда - Государство и право контрольная работа


Report Page