Материал: Лампанель

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Отладка

Программу можно выполнить всю целиком (клавиша 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

  • прочитать значение из порта в регистр

14

Программа «ЛамПанель»

Программа «ЛамПанель» Основные идеи

Программа-тренажёр «ЛамПанель» – это учебная модель компьютера, который управляет панелью лампочек. Тренажёр можно использовать:

  • для изучения принципов работы компьютера (процессор, ОЗУ, ПЗУ);

  • для начального изучения программирования на языке ассемблера;

  • для изучения операций с целыми числами, в том числа поразрядных логических операций и сдвигов.

Модель компьютера включает процессор, оперативную память (ОЗУ), постоянную память (ПЗУ) и устройство вывода – панель лампочек размером 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 InFirst 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)

Если подпрограмма использует какой-то регистр, которые не содержит исходные данные и не предназначен для записи результата, она должна сохранить его стеке при входе и восстановить старое значение из стека при выходе. Например: