Лампанель. Программа ЛамПанель Программа ЛамПанель
Скачать 247.5 Kb.
|
Программа «ЛамПанель» Программа «ЛамПанель»Основные идеиПрограмма-тренажёр «ЛамПанель» – это учебная модель компьютера, который управляет панелью лампочек. Тренажёр можно использовать: для изучения принципов работы компьютера (процессор, ОЗУ, ПЗУ); для начального изучения программирования на языке ассемблера; для изучения операций с целыми числами, в том числа поразрядных логических операций и сдвигов. Модель компьютера включает процессор, оперативную память (ОЗУ), постоянную память (ПЗУ) и устройство вывода – панель лампочек размером 8×16. Для демонстрации через проектор можно вывести увеличенную панель, нажав клавишу F10. Система команд процессора основана на идеях известной в свое время серии 16-разрядных мини-ЭВМ PDP-11. Непосредственным предшественником тренажёра «ЛамПанель» можно считать модель компьютера E97 Е.А. Ерёмина (http://educomp.org.ru/e97/), с которым процессор тренажёра «ЛамПанель» частично совместим по системе команд. Программа для такого процессора составляется на языке ассемблера, в котором каждая символьная команда соответствует одной (числовой) команде процессора. Программа набирается в окне «Программа». Программу можно сохранять в виде файла на диске, а потом загружать в память из файла (с помощью меню «Файл»). При запуске (по клавише F9) набранная программа транслируется (переводится в машинные коды, которые появляются в окне «Отладчик») и начинается ее выполнение. В окне «Данные в памяти» показывается содержимое оперативной памяти, в которой расположены программа и данные (принцип однородности). Процессор имеет 4 регистра общего назначения (РОН), которые называются R0, R1, R2 и R3. Кроме того, есть еще три внутренних регистра, недоступные программисту (но видимые в окне программы): PC (англ. programcounter) – программный счетчик, счётчик команд, указывающий на следующую выполняемую команду; SP (англ. stackpointer) – указатель стека, адрес вершины стека; стек размещается в нижней части оперативной памяти, его содержимое можно просмотреть в нижней части окна «Данные в памяти»; PS (англ. processorstate) – регистр состояния процессора; используются только три младших бита: 0 – бит N (англ. negative, отрицательный результат), 1 – бит Z (англ. zero, нулевой результат) и 2 – бит C (англ. carry, перенос). В качестве устройства вывода используется панель лампочек размером 8×16. Каждый ряд лампочек управляется через отдельный порт вывода. Всего используется восемь 16-разрядных портов с именами P0, P1, P2, P3, P4, P5, P6 и P7. Постоянное запоминающее устройство (ПЗУ) предназначено для хранения системных подпрограмм. Код ПЗУ загружается при старте программы из текстового файла, поэтому пользователь может изменять содержимое ПЗУ: добавлять, удалять и изменять любые процедуры. Простейшая программаПрограмма должна заканчиваться командой stop. Например, самая простая программа: stop Команда NOP (англ. nooperation, нет операции) – это пустая команда, она ничего не делает. Комментарий начинается символом «точка с запятой»: nop ; пустая команда stop ОтладкаПрограмму можно выполнить всю целиком (клавиша F9) или в пошаговом режиме (F8). В пошаговом режиме в окне отладчика зелёным цветом выделяется текущая строка, которая будет выполнена при следующем нажатии F8. Сочетание клавиш Ctrl+F8 позволяет отменить только что сделанную команду. Клавиша F7 (вместо F8) позволяет войти в подпрограмму и выполнить ее пошагово (см. раздел «Подпрограммы» ниже). Если установить курсор в какую-то строчку программы и нажать клавишу F4, программа будет выполняться до этой строчки и затем остановится. Движок «Скорость» изменяет скорость выполнения программы. Все команды отладки включены в меню «Программа». Кроме того, они могут выполняться с помощью кнопок панели инструментов:
С помощью меню «Регистры» можно изменить значения любого регистра во время выполнения программы в пошаговом режиме. Работа с регистрами и портамиДля простейшей обработки данных можно использовать 4 регистра процессора и 8 портов ламповой панели. Основные операции: записать данные в регистр, например,
Все числа записываются в шестнадцатеричной системе счисления. скопировать значение из одного регистра в другой, например,
вывести значение регистра в порт
прочитать значение из порта в регистр
Пример программы:
Арифметические операцииАрифметические операции могут выполняться с числами (константами) и значениями регистров. Результат записывается по адресу второго операнда-регистра (это не может быть число). сложение
вычитание
умножение
деление
Логические операцииЛогические операции могут выполняться с числами (константами) и значениями регистров. Результат записывается по адресу второго операнда-регистра (это не может быть число). отрицание («НЕ»)
логическое умножение («И»)
логическое сложение («ИЛИ»)
сложение по модулю 2 («исключающее ИЛИ»)
СдвигиВ командах сдвига первый операнд – это величина сдвига (от 1 до 1016), а второй – регистр. логический сдвиг влево и вправо
арифметический сдвиг вправо
циклический сдвиг влево и вправо
циклический сдвиг влево и вправо через бит переноса
Метки, сравнения и переходыКоманды перехода используются для выполнения разветвляющихся алгоритмов. Различают безусловный переход (переходить всегда) и условные переходы (переход при выполнении какого-то условия). Чтобы обозначить место перехода, необходимо создать метку. Метка – это произвольное имя, за которым следует двоеточие. После двоеточия не должно быть никаких символов (метка – это отдельная строка программы). Безусловный переход имеет формат jmp метка Пример программы (бесконечный цикл): qq: nop jmp qq Условные переходы зависят от битов состояния процессора, которые определяются результатом последней операции: jge метка ; если больше или равно jl метка ; если меньше jnz метка ; если не нуль jz метка ; если нуль jle метка ; если меньше или равно jg метка ; если больше Пример программы (цикл из 5 шагов):
Существует команда сравнения, которая изменяет только биты состояния процессора:
Пример программы:
ПодпрограммыПодпрограммы – это вспомогательные алгоритмы, которые можно вызывать по имени. В языке ассемблера имя подпрограммы – это метка. Для вызова подпрограммы используется команда call метка Подпрограмма должна заканчиваться командой возврата из подпрограммы ret Подпрограммы располагаются в программе ниже основной программы, после команды stop. Пример программы, которая использует подпрограмму divMod для деления с остатком:
Чтобы при отладке выполнять по шагам не только основную программу, но и подпрограмму, при выполнении команды call нужно нажать не F8, а F7. Работа со стекомСтек – это структура типа LIFO (англ. LastIn – FirstOut, последним пришел – первым ушел). В современных компьютерах стек размещается в памяти, специальный регистр SP (англ. stackpointer) указывает на начало стека. Для работы со стеком используются всего две команды:
Конечно, сохранять в стеке можно не только R0, но и другие регистры. Стек используется: для временного хранения данных для хранения адресов возврата из подпрограмм для размещения локальных переменных подпрограмм Пример программы (обмен значений регистров R0 и R1):
Если подпрограмма использует какой-то регистр, которые не содержит исходные данные и не предназначен для записи результата, она должна сохранить его стеке при входе и восстановить старое значение из стека при выходе. Например:
Заметьте, что подпрограмма, приведенная в предыдущем пункте, не совсем грамотно написана – она не сохраняет значение регистра R2, хотя «портит» его во время работы. Вызов подпрограмм из ПЗУПЗУ в данной модели компьютера – это набор подпрограмм, каждая из которых заканчивается командой ret. Всего в ПЗУ может быть до 256 подпрограмм. ПЗУ загружается при запуске тренажёра «ЛамПанель» из файла lampanel.rom, который должен находиться в том же каталоге, что и сама программа. Это обычный текстовый файл, который можно редактировать в редакторах типа Блокнота (если, конечно, вы понимаете, что вы делаете). В настоящей версии в ПЗУ включены следующие подпрограммы:
Просмотреть содержимое ПЗУ можно с помощью пункта меню «Программа-Просмотр ПЗУ» или кнопки на панели инструментов. Выделив какую-нибудь строчку в левой части окна, мы увидим справа текст выбранной подпрограммы и ее коды: Для вызова подпрограмм из ПЗУ нужно использовать команду system номер_подпрограммы Пример программы:
Байтовые командыВсе рассмотренные выше команды работают с 16-битными данными (словами). Часто, например, при обработке текстов, нужно использовать однобайтные данные. Для этого предназначены следующие команды, которые полностью аналогичны соответствующим командам без буквы «b» (от англ. byte) на конце:
Команда movb очищает старший байт регистра, в который копируются данные. Например,
Остальные команды никак не изменяют старший байт регистра-приемника. Существует специальная команда для обмена старшего и младшего байтов слова: swapb регистр Пример программы:
Работа с даннымиСогласно принципу однородности памяти фон Неймана, данные размещаются в той же области памяти, что и программа (обычно сразу после команды stop). В тренажере «ЛамПанель» данные – это 16-битные слова (вводятся как числа в шестнадцатеричной системе счисления) или символьные строки, заключенные в двойные кавычки. Для размещения данных в памяти применяется команда data. Например: ... ; основная программа stop ddd: ; метка начала блока данных data 1234 ; слово 123416 data 5678 ; слово 567816 data "Ехал Грека через реку" ; строка Для того, чтобы работать с этими данными, нужно как-то к ним обратиться. Для этого используется косвенная адресация – в регистре находятся не сами данные, а их адрес в памяти. Рассмотрим пример:
Запись @метка означает «адрес метки». Запись (R0) означает «данные, адрес которых находится в R0» – это и есть косвенная адресация. Косвенную адресацию можно использовать и в других командах, работающих с регистрами. Обработка массивовПусть в блоке данных, который начинается на метке ddd, записан массив, который нужно обработать в цикле. В этом случае удобно использовать косвенную адресацию с автоматическим увеличением адреса. Запись «(R0)+» означает «работать с данными, адрес которых находится в R0, и после выполнения операции увеличить R0». Если команда работает со словом, R0 увеличится на 2, а если с байтом – на 1. Пример программы:
Пример программы обработки байтов:
Самомодифицирующиеся программыПоскольку данные находятся в той же области памяти, что и программы, программа может изменять свой код во время выполнения. Например, для защиты от взлома может быть использовано шифрование: основной код программы зашифрован, и она сама себя расшифровывает при запуске. Пример самомодифицирующейся программы:
Расширение ПЗУПользователь может добавить свои подпрограммы в ПЗУ. Для этого нужно сначала отладить подпрограмму, а затем сохранить ее в специальном формате с помощью кнопки или пункта меню «Программа – Сохранить как ПЗУ». Например, напишем подпрограмму, которая переставляет биты числа в обратном порядке, используя циклический сдвиг через бит переноса:
Отладив эту программу, уберем верхние три строчки, оставив только процедуру, и применяем команду меню «Программа – Сохранить как ПЗУ». Полученный файл (он будет иметь расширение .rom) открываем в любом текстовом редакторе (например, в Блокноте) и добавляем в начало комментарий: ; Перестановка битов R0 ; в обратном порядке ;----------------------- 2E10 PUSH R1 2E20 PUSH R2 01D2 MOV 10, R2 0010 0911 XOR R1, R1 9E00 RCL 1, R0 AE01 RCR 1, R1 03D2 SUB 1, R2 0001 4D0D JNZ 000A FFF4 0110 MOV R1, R0 3E20 POP R2 3E10 POP R1 0D00 RET Теперь остается добавить (также в текстовом редакторе) этот фрагмент в конец файла lampanel.rom. Новая процедура будет доступна при следующем запуске программы «ЛамПанель». ПриложениеСправочник по языку ассемблера «ЛамПанель»Регистры: R0, R1, R2, R3 – регистры общего назначения; PC – программный счетчик; SP – указатель стека; PS – регистр состояния: бит 0 – знак (бит N, negative), бит 1 – равенство нулю (бит Z, zero) бит 2 – бит переноса (бит C, carry). Обозначения при описании форматов команд: n – число в шестнадцатеричной системе счисления Rx – некоторый регистр общего назначения Px – некоторый порт Метки: Метка – это последовательность символов, заканчивающаяся двоеточием. Кроме метки, в строке не должно быть других символов. Основные команды: NOP – нет операции STOP – останов MOV Ry,Rx – пересылка Rx:=Ry MOV n,Rx – пересылка Rx:=n ADD Ry,Rx – сложение Rx:=Rx+Ry ADD n,Rx – сложение Rx:=Rx+n SUB Ry,Rx – вычитание Rx:=Rx–Ry SUB n,Rx – вычитание Rx:=Rx–n CMP Rx,Ry – сравнение (установка флагов по разности Rx–Ry) CMP n,Rx – сравнение (установка флагов по разности n-Rx) MUL Ry,Rx – умножение Rx:=Rx*Ry MUL n,Rx – умножение Rx:=Rx*n DIV Ry,Rx – деление Rx:=Rx div Ry DIV n,Rx – деление Rx:=Rx div n Логические операции: NOT Rx – логические «НЕ» (инверсия) Rx:=not Rx AND Ry,Rx – логическое «И» (конъюнкция) Rx:=Rx and Ry AND n,Rx – логическое «И» (конъюнкция) Rx:=Rx and n OR Ry,Rx – логическое «ИЛИ» (дизъюнкция) Rx:=Rx or Ry OR n,Rx – логическое «ИЛИ» (дизъюнкция) Rx:=Rx or n XOR Ry,Rx – «исключающее ИЛИ» Rx:=Rx xor Ry XOR n,Rx – «исключающее ИЛИ» Rx:=Rx xor n Сдвиги: SHL n,Rx – логический сдвиг влево Rx:=Rx shl n SHR n,Rx – логический сдвиг вправо Rx:=Rx shr n SAR n,Rx – арифметический сдвиг вправо Rx:=Rx sar n ROL n,Rx – циклический сдвиг влево Rx:=Rx rol n ROR n,Rx – циклический сдвиг вправо Rx:=Rx ror n RCL n,Rx – циклический сдвиг влево через перенос Rx:=Rx rcl n RCR n,Rx – циклический сдвиг вправо через перенос Rx:=Rx rcr n Байтовые команды: MOVB Ry,Rx – пересылка младшего байта Rx:=Ry MOVB n,Rx – пересылка младшего байта Rx:=n CMPB Rx,Ry – сравнение (установка флагов по разности байтов Ry–Rx) CMPB n,Rx – сравнение (установка флагов по разности байтов n-Rx) SHLB n,Rx – логический сдвиг байта влево Rx:=Rx shl n SHRB n,Rx – логический сдвиг байта вправо Rx:=Rx shr n SARB n,Rx – арифметический сдвиг байта вправо Rx:=Rx sar n ROLB n,Rx – циклический сдвиг байта влево Rx:=Rx rol n RORB n,Rx – циклический сдвиг байта вправо Rx:=Rx ror n RCLB n,Rx – циклический сдвиг байта влево через перенос Rx:=Rx rcl n RCRB n,Rx – циклический сдвиг байта вправо через перенос Rx:=Rx rcr n SWAPB Rx – поменять местами байты в регистре Rx Переходы: JMP адрес или метка – безусловный переход JGE адрес или метка – если больше или равно JL адрес или метка – если меньше JNZ адрес или метка – если не нуль JZ адрес или метка – если нуль JLE адрес или метка – если меньше или равно JG адрес или метка – если больше Процедуры: CALL адрес или метка – вызов процедуры SYSTEM номер – вызов процедуры из ПЗУ с заданным номером RET – возврат из процедуры Размещение данных: DATA число – число записывается в память как слово DATA "строка" – символьная строка записывается в память Работа со стеком: PUSH Rx – сохранить в стеке регистр Rx POP Rx – восстановить из стека регистр Rx Работа с портами, которые управляют лампочками: Порты: P0, P1, P2, P3, P4, P5, P6, P7. Все порты доступны на чтение и запись. IN Py,Rx – ввод из порта Py в регистр Rx OUT Rx,Py – вывод из регистра Rx в порт Py Относительная адресация: MOV @метка,Rx – записать адрес метки в регистр Rx (Rx) – операнд находится в ячейке, адрес которой записан в регистре Rx (Rx)+ – то же самое, но после выполнения операции значение Rx увеличивается на 2 для команды, работающей со словом, и на 1 для байтовой команды
|