Переслать ОП1 в ОП2 – пересылает значение первого операнда во второй операнд.
Добавить ОП1 к ОП2– добавляет значение первого операнда ко второму операнду, результат во втором операнде.
Вычесть ОП1 из ОП2 – вычитает значение первого операнда из второго операнда, результат во втором операнде.
Сравнить ОП1 с ОП2 – сравнивает разность второго и первого операнда с нулем, значения операндов не меняются, результат влияет на состояние регистра состояний.
Безадресные команды.
Возврат из подпрограммы – осуществляет возврат из подпрограммы в ячейку, следующую за командой вызвавшей эту подпрограмму, используется только в подпрограммах
Стоп – команда останова, ставится обязательно в конце программы, после ее выполнения ни какие команды не выполняются.
Команды перехода.
Переход на К слов – безусловный переход – осуществляет переход на К слов.
Вызов подпрограммы по адресу – переход на адрес К с запоминанием адреса возврата для команды возврата из подпрограммы.
Если <> переход на К слов – переход на К слов, если результат <>0.
Если = переход на К слов – переход на К слов, если результат =0.
Если >= переход на К слов – переход на К слов, если результат >=0.
Если > переход на К слов – переход на К слов, если результат >0.
Если < переход на К слов – переход на К слов, если результат <0.
Если <= переход на К слов – переход на К слов, если результат <=0.
Работа команды условного перехода осуществляется следующим образом: если анализируемое условие справедливо, то переход происходит. В противном случае никаких действий не производится, а значит, переход игнорируется и процессор, как обычно, выбирает следующую команду. Справедливость анализируемого условия определяется по состоянию регистра состояний, которое в свою очередь зависит от результата команды сравнения.
Таким образом, выше изложена операционная часть команд, которые выполняет мой имитатор. Посмотрим, какими способами могут быть представлены операнды ОП1 и ОП2. Для своего проекта я отобрал три наиболее простых из имеющихся в реальных процессорах метода адресации. Это регистровый, косвенный и автоинкрементный способы адресации, подробно они рассматриваются в первой части моей курсовой работы.
Не менее важной частью программы является часть Регистры, в которой расположены регистры используемые в моем проекте. Для своего имитатора процессора я решил использовать восемь шестнадцати разрядных регистров общего назначения (c R0 по R7) и особого регистра, в котором отражается текущее состояние процессора – регистра состояний PS.
Любой из регистров общего назначения может использоваться в командах на равных основаниях. Вместе с тем имеется два выделенных регистра, содержимое которых моя программа использует для собственных нужд. Прежде всего это регистр R7, выполняющий роль счетчика команд. Другим выделенным регистром является указатель стека R6. Остальные 6 регистров, обозначаемые R0 - R5, пользователь может использовать по своему усмотрению. Уместно заметить, что выделенные регистры программы R6 и R7 могут использоваться в любой команде наряду с обычными регистрами общего назначения R0 - R5. Как уже упоминалось регистры обшего назначения шестнадцати разрядные, то есть диапазон принимаемых значений от -32768 до 32767.
Регистр состояний PS в моем проекте является двухбитным. Его особенностью является то, что каждый его бит имеет самостоятельное значение и может использоваться процессором отдельно от других. Используемые биты регистра обозначаются N и Z. Управляющие признаки N (Negative) характеризует наличие знака минус у результата операций: если число отрицательое, то N=1, в случае неотрицательного значения N=0. Бит Z (Zero) говорит о равенстве или неравенстве нулю результата: в первом случае Z=1, иначе Z=0. Значение этих битов зависит от результата операции сравнения и влияет в свою очередь на операцию условного перехода. Регистр состояний управляется только программно и недоступен пользователю.
Третью часть программы составляет Память. Эта часть моей программы реализована в отдельном окне, которое можно убрать. Если окно открыто, то оно всегда находится поверх главного окна. Окно Память предназначено для демонстрации работы процессора с памятью ЭВМ. В памяти хранится программа, которая написанная пользователем, представленная в машинных кодах. В моем проекте коды реализованы в десятичной системе счисления. Также в памяти можно хранить данные в тех ячейках, которые не отводятся под программу. При использовании косвенной и автоинкрементной адресаций обращение идет к данным, которые хранятся именно в памяти.
Таковы основные части моей программы. Рассмотрим теперь состав главного меню программы. Меню состоит из трех пунктов: файл, правка, пуск. Рассмотрим каждое из них по отдельности.
Пункт меню Файл позволяет работать с написанной пользователем программой как с отдельным файлом и включает следующие подпункты:
Новый – создает новый файл, очищая редактор и регистры.
Открыть – открывает файл.
Сохранить – сохраняет в файл с расширением pdp и текущим именем.
Сохранить как – сохраняет в файл с расширением pdp и новым именем.
Выход – выход из имитатора.
Пункт меню Правка включает пункты подменю, которые позволяют редактировать текст программы написанной пользователем. В нем имеются следующие подпункты:
Очистить – полностью удаляет содержимое либо только редактора, либо только регистров, либо редактора и регистров одновременно. Имя файла при этом не меняется (в этом отличие от пункта меню Новый).
Вставить – вставляет в редакторе пустую строку перед текущей.
Удалить – удаляет текущую строку в редакторе.
Пункт меню Пуск предназначен для исполнения написанной пользователем программы. Включает следующие подпункты:
Пуск – запускает написанную пользователем программу.
По шагам – позволяет выполнять каждую команду по отдельности.
Стоп – осуществляет прерывание запущенной программы.
Пауза – позволяет сделать паузу при выполнении запущенной программы
Продолжить – продолжает исполнение программы, после нажатия паузы.
Некоторые подпункты этого пункта доступны только при исполнении программы.
Некоторые пункты главного меню вынесены как кнопки. Также вы можете увидеть кнопку Память, при нажатии на которую появляется окно Память.
Итак, вы познакомились со структурой моего имитатора. Теперь можно приступить к написанию программы.
Основная программа, как уже было сказано выше, пишется в редакторе, который по структуре напоминает таблицу. При запуске имитатора редактор пуст и курсор находится в начале первого столбца редактора. Перемещаться по редактору можно с помощью клавиш управления курсора, либо с помощью мыши. Выбор команды осуществляется только, когда курсор находится в первом или четвертом столбце. При нажатии клавиши Enter или нажатии левой кнопки мыши появится список команд, из которого вы можете выбрать необходимую команду. Все команды пишутся в первом столбце редактора. Дальнейшие ваши действия зависят от того, какую команду вы выбрали.
Если вы выбрали двухадресную команду, то во втором и четвертом столбце появятся операнды, которые будут у команды по умолчанию. Если вы хотите задать свои операнды, то необходимо переместится в то место редактора, где находится нужный вам операнд. Перемещение производится с помощью клавиш управления курсором, либо с помощью мыши. Для выбора необходимого вам операнда следует нажать клавишу Enter, либо нажать левую кнопку мыши. При нажатии появляется список доступных операндов, из которого вы выбираете необходимый.
Если вы выбрали одноадресную команду, то операнды появятся только во втором столбце редактора. Выбор нужного вам операнда осуществляется также как для двух адресной команды.
Если вы выбрали команду перехода, то во втором столбце редактора появится количество слов, на которое осуществляется переход (по умолчанию 0). Для того чтобы задать свое количество шагов необходимо переместится в то место редактора, где находится значение перехода, нажать Enter, либо кнопку мыши, и ввести свое значение. При выборе команды "Вызов подпрограммы" в нижней строке появится вторая часть этой команды – "по адресу 0". Во втором столбце этой строки необходимо указать адрес подпрограммы.
При выборе безадресных команд появится только команда в первом столбце.
При заполнении редактора или изменении программы в памяти происходят изменения. В соответствующей ячейке появляется код новой команды. В ячейки, не содержащие программу, заносятся нули.
Когда вы написали все команды нужно приступить к заполнению регистров. Для заполнения регистров необходимо перевести указатель мыши на часть Регистры и нажать левую кнопку мыши, либо нажать клавишу Tab. При заполнении регистров стоит вспомнить, что максимальное число, которое может храниться в регистре, равно 32767, а минимальное -32768. Поэтому если вы попытаетесь ввести число больше максимального или меньше минимального, то цифра разряда, которую вы ввели, будет равна максимальной цифре, которая может находится в данном разряде числа. Аналогично при исполнении программы, если число заносимое в регистр будет меньше минимального или больше максимального, то значение соответствующего регистра будет минимальным, либо максимальным. Также необходимо помнить что, регистр R7 является счетчиком команды, поэтому туда необходимо занести адрес ячейки начала программы. При использовании подпрограммы в регистр R6 необходимо занести адрес начала стека.
В последнюю очередь при написании программы необходимо занести данные в память. Но это необходимо сделать, только если вы используйте в своей программе косвенный или автоинкрементный способ адресации. Для занесения данных в память необходимо активизировать окно Память. Это можно сделать, нажав кнопку Память (если окна Память нет), либо направив курсор мыши на окно Память нажать левую кнопку мыши. Следует помнить, что в те ячейки памяти, которые отведены под программу, данные заносить нельзя.