Pavel Chumakou

Тест на программиста

Вы находитесь на космическом корабле. На борту сломался основной компьютер, и чтобы вернуться на Землю, вам необходимо научиться программировать на запасном вычислительном устройстве (на картинке).

Вычислительное устройство (далее ВУ) состоит из 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.