Программу можно выполнить всю целиком (клавиша F9) или в пошаговом режиме (F8). В пошаговом режиме в окне отладчика зелёным цветом выделяется текущая строка, которая будет выполнена при следующем нажатии F8. Сочетание клавиш Ctrl+F8 позволяет отменить только что сделанную команду.
Клавиша F7 (вместо F8) позволяет войти в подпрограмму и выполнить ее пошагово (см. раздел «Подпрограммы» ниже).
Если установить курсор в какую-то строчку программы и нажать клавишу F4, программа будет выполняться до этой строчки и затем остановится.
Движок «Скорость» изменяет скорость выполнения программы.
Все команды отладки включены в меню «Программа». Кроме того, они могут выполняться с помощью кнопок панели инструментов:
|
|
Трансляция в машинные коды без выполнения (Ctrl+F9). |
|
|
Трансляция и выполнение (F9). |
|
|
Выполнить один шаг (F8). |
|
|
Отменить один шаг (Ctrl+F8). |
|
|
Войти в подпрограмму (F7). |
|
|
Выполнить до курсора (F4). |
С помощью меню «Регистры» можно изменить значения любого регистра во время выполнения программы в пошаговом режиме.
Для простейшей обработки данных можно использовать 4 регистра процессора и 8 портов ламповой панели. Основные операции:
записать данные в регистр, например,
|
ассемблер |
псевдокод |
|
mov 1234, R0 |
R0:=123416 |
Все числа записываются в шестнадцатеричной системе счисления.
скопировать значение из одного регистра в другой, например,
|
ассемблер |
псевдокод |
|
mov R0, R1 |
R1:=R0 |
вывести значение регистра в порт
|
ассемблер |
псевдокод |
|
out R0, P1 |
P1:=R0 |
прочитать значение из порта в регистр
Программа «ЛамПанель»
Программа-тренажёр «ЛамПанель» – это учебная модель компьютера, который управляет панелью лампочек. Тренажёр можно использовать:
для изучения принципов работы компьютера (процессор, ОЗУ, ПЗУ);
для начального изучения программирования на языке ассемблера;
для изучения операций с целыми числами, в том числа поразрядных логических операций и сдвигов.
Модель компьютера включает процессор, оперативную память (ОЗУ), постоянную память (ПЗУ) и устройство вывода – панель лампочек размером 8×16. Для демонстрации через проектор можно вывести увеличенную панель, нажав клавишу F10.
Система команд процессора основана на идеях известной в свое время серии 16-разрядных мини-ЭВМ PDP-11. Непосредственным предшественником тренажёра «ЛамПанель» можно считать модель компьютера E97 Е.А. Ерёмина (http://educomp.org.ru/e97/), с которым процессор тренажёра «ЛамПанель» частично совместим по системе команд.
Программа для такого процессора составляется на языке ассемблера, в котором каждая символьная команда соответствует одной (числовой) команде процессора. Программа набирается в окне «Программа». Программу можно сохранять в виде файла на диске, а потом загружать в память из файла (с помощью меню «Файл»).
При запуске (по клавише F9) набранная программа транслируется (переводится в машинные коды, которые появляются в окне «Отладчик») и начинается ее выполнение.

В окне «Данные в памяти» показывается содержимое оперативной памяти, в которой расположены программа и данные (принцип однородности).
Процессор имеет 4 регистра общего назначения (РОН), которые называются R0, R1, R2 и R3. Кроме того, есть еще три внутренних регистра, недоступные программисту (но видимые в окне программы):
PC (англ. program counter) – программный счетчик, счётчик команд, указывающий на следующую выполняемую команду;
SP (англ. stack pointer) – указатель стека, адрес вершины стека; стек размещается в нижней части оперативной памяти, его содержимое можно просмотреть в нижней части окна «Данные в памяти»;
PS (англ. processor state) – регистр состояния процессора; используются только три младших бита: 0 – бит N (англ. negative, отрицательный результат), 1 – бит Z (англ. zero, нулевой результат) и 2 – бит C (англ. carry, перенос).
В качестве устройства вывода используется панель лампочек размером 8×16. Каждый ряд лампочек управляется через отдельный порт вывода. Всего используется восемь 16-разрядных портов с именами P0, P1, P2, P3, P4, P5, P6 и P7.
Постоянное запоминающее устройство (ПЗУ) предназначено для хранения системных подпрограмм. Код ПЗУ загружается при старте программы из текстового файла, поэтому пользователь может изменять содержимое ПЗУ: добавлять, удалять и изменять любые процедуры.
Программа должна заканчиваться командой stop. Например, самая простая программа:
stop
Команда NOP (англ. no operation, нет операции) – это пустая команда, она ничего не делает. Комментарий начинается символом «точка с запятой»:
nop ; пустая команда
stop
Логические операции могут выполняться с числами (константами) и значениями регистров. Результат записывается по адресу второго операнда-регистра (это не может быть число).
отрицание («НЕ»)
|
ассемблер |
псевдокод |
|
not R1 |
R1:= not R1 |
логическое умножение («И»)
|
ассемблер |
псевдокод |
|
and R0, R1 and 1234, R1 |
R1:= R1 and R0 R1:= R1 and 123416 |
логическое сложение («ИЛИ»)
|
ассемблер |
псевдокод |
|
or R0, R1 or 1234, R1 |
R1:= R1 or R0 R1:= R1 or 123416 |
сложение по модулю 2 («исключающее ИЛИ»)
|
ассемблер |
псевдокод |
|
xor R0, R1 xor 1234, R1 |
R1:= R1 xor R0 R1:= R1 xor 123416 |
Сдвиги
В командах сдвига первый операнд – это величина сдвига (от 1 до 1016), а второй – регистр.
логический сдвиг влево и вправо
|
ассемблер |
псевдокод |
|
shl 2, R1 shr F, R1 |
R1:= R1 shl 216 R1:= R1 shr F16 |
арифметический сдвиг вправо
|
ассемблер |
псевдокод |
|
sar 2, R1 |
R1:= R1 sar 216 |
циклический сдвиг влево и вправо
|
ассемблер |
псевдокод |
|
rol 2, R1 ror F, R1 |
R1:= R1 rol 216 R1:= R1 ror F16 |
циклический сдвиг влево и вправо через бит переноса
|
ассемблер |
псевдокод |
|
in P2, R0 |
R0:=P2 |
Пример программы:
|
ассемблер |
псевдокод |
|
mov 1234, R0 mov R0, R2 out R2, P1 stop |
R0:= 123416 R2:= R0 P1:= R2 стоп |
Арифметические операции могут выполняться с числами (константами) и значениями регистров. Результат записывается по адресу второго операнда-регистра (это не может быть число).
сложение
|
ассемблер |
псевдокод |
|
add 1, R1 add R2, R3 |
R1:= R1 + 1 R3:= R3 + R2 |
вычитание
|
ассемблер |
псевдокод |
|
sub 2, R1 sub R2, R3 |
R1:= R1 - 2 R3:= R3 - R2 |
умножение
|
ассемблер |
псевдокод |
|
mul 5, R1 mul R2, R3 |
R1:= R1 * 5 R3:= R3 * R2 |
деление
|
ассемблер |
псевдокод |
|
div 12, R1 div R2, R3 |
R1:= R1 div 12 R3:= R3 div R2 |
Подпрограммы – это вспомогательные алгоритмы, которые можно вызывать по имени. В языке ассемблера имя подпрограммы – это метка. Для вызова подпрограммы используется команда
call метка
Подпрограмма должна заканчиваться командой возврата из подпрограммы
ret
Подпрограммы располагаются в программе ниже основной программы, после команды stop.
Пример программы, которая использует подпрограмму divMod для деления с остатком:
|
ассемблер |
псевдокод |
|
mov 1234, R0 mov 10, R1 call divMod stop divMod: mov R0, R2 div R1, R0 mul R0, R1 sub R1, R2 mov R2, R1 ret |
R0:= 123416 R1:= 1016 вызвать divMod стоп
R2:= R0 R0:= R0 div R1 R1:= R1 * R0 R2:= R2 – R1 R1:= R2 возврат |
Чтобы при отладке выполнять по шагам не только основную программу, но и подпрограмму, при выполнении команды call нужно нажать не F8, а F7.
Стек – это структура типа LIFO (англ. Last In – First Out, последним пришел – первым ушел). В современных компьютерах стек размещается в памяти, специальный регистр SP (англ. stack pointer) указывает на начало стека. Для работы со стеком используются всего две команды:
|
ассемблер |
псевдокод |
|
push R0 pop R0 |
сохранить R0 в стеке «снять» данные с вершины стека в R0 |
Конечно, сохранять в стеке можно не только R0, но и другие регистры.
Стек используется:
для временного хранения данных
для хранения адресов возврата из подпрограмм
для размещения локальных переменных подпрограмм
Пример программы (обмен значений регистров R0 и R1):
|
ассемблер |
псевдокод |
|
push R0 push R1 pop R0 pop R1 |
R0 – в стек R1 – в стек со стека – в R0 (старое значение R1) со стека – в R1 (старое значение R0) |
Если подпрограмма использует какой-то регистр, которые не содержит исходные данные и не предназначен для записи результата, она должна сохранить его стеке при входе и восстановить старое значение из стека при выходе. Например: