Тест на программиста
Вы находитесь на космическом корабле. На борту сломался основной компьютер, и чтобы вернуться на Землю, вам необходимо научиться программировать на запасном вычислительном устройстве (на картинке).
Вычислительное устройство (далее ВУ) состоит из 200 ячеек памяти и двух регистров AX и BX. В ячейки памяти можно записывать команды и числа. В регистры можно записывать только числа. Примеры команд показаны справа на картинке (о командах будет далее).
ВУ умеет выполнять команды. Команды выполняются последовательно, одна за другой. Выполнение команд начинается с ячейки с номером 100. Другими словами, первая команда вашей программы должна записываться в ячейку с номером 100. Таким образом, первые 100 ячеек используются для хранения и обработки данных (чисел), последующие 100 ячеек (с номерами 100-199) используются для записи команд (и последующего выполнения).
К ячейке 99 прикреплен маленький экран, который постоянно отображает число, записанное в эту ячейку. Таким образом, результат работы программы должен быть записан в ячейку 99, чтобы можно было его увидеть. Программа запускается кнопкой START.
ВУ понимает и может выполнять следующие команды:
|
ADD <N> AX (AX = AX + <N>) ADD <N> BX |
Прибавить к регистру AX (BX) число, находящееся в ячейке с номером N |
|
SUB <N> AX (AX = AX - <N>) SUB <N> BX |
Вычесть из регистра AX (BX) число, находящееся в ячейке с номером N |
|
STOP |
Остановить выполнение программы. |
|
MOV <N> AX (AX = <N>) MOV <N> BX MOV AX BX (BX = AX) MOV BX AX (AX = BX) MOV AX <N> (<N> = AX) MOV BX <N> MOV N AX (AX = N) MOV N BX (BX = N) MOV N <N> (<N> = N) |
Переместить значение с первого операнда (это или номер ячейки, или просто число, или регистр) во второй операнд (это или номер ячейки или регистр). Например: МОV 5 <23> - записать число 5 в ячейку 23 MOV 15 AX - записать число 15 в регистр AX MOV <10> BX - записать число, находящееся в ячейке 10, в регистр BX |
|
JMP <N> |
Продолжить выполнение команд с ячейки N |
|
JMPAXZERO <N> (Jump if AX = 0) JMPBXZERO <N> |
Продолжить выполнение команд начиная с ячейки N, если регистр AX (BX) содержит 0. Если регистр содержит отличное от нуля значение, продолжить выполнение со следующей команды. |
|
JMPAXPOS <N> (Jump if AX > 0) JMPBXPOS <N> |
Продолжить выполнение команд начиная с ячейки N, если регистр AX (BX) содержит число больше 0 |
|
JMPAXNEG <N> (Jump if AX < 0) JMPBXNEG <N> |
Продолжить выполнение команд начиная с ячейки N, если регистр AX (BX) содержит число меньше 0 |
|
DONOTHING |
Ничего не делать |
Пример программы
Условие задачи: Нам необходимо написать программу, которая будет выводить большее из чисел, находящихся в ячейках 0 и 1.
Программа:
100 MOV <1> AX // поместить первую ячейку в AX
101 SUB <2> AX // вычесть вторую ячейку из AX, т.е. в AX будет разница первой и второй команды
102 JMPAXPOS <106> // сравнить содержимое AX с нулем, если оно больше нуля то идем на ячейку 106
103 MOV <2> BX // разница меньше или равна нулю, выводим вторую ячейку
104 MOV BX <99>
105 STOP // остановиться, в ячейке 99 (и на экране) вторая ячейка
106 MOV <1> BX // разница больше нуля, выводим первую ячейку
107 MOV BX <99>
108 STOP // остановиться, в ячейке 99 (и на экране) первая ячейка
Задача (условие теста)
Написать программу, которая будет выводить большее из трех чисел, находящихся в ячейках 0, 1 и 2.