Contest.uni-smr.ac.ru :: соревнования по программированию
Русская версия || English version
Login:
Password:
Забыли пароль?
 пример поиска: Вася Пупкин
 






Эмулятор

Задачу добавил: alef

Успешно сдано решений: 4

Когда система команд процессора была разработана, программисты компании
Closed Systems решили разработать библиотеку алгоритмов на машинном языке.
Конечно, эти алгоритмы надо протестировать. Для этого необходимо написать
эмулятор. Конечно, разработка эмулятора для всех команд - дело долгое.
Но можно выполнять большую работу по частям. Начнем с целочисленной арифметики.

Все команды могут быть помеченными и непомеченными. Метка - это четыре
десятичных цифры, от команды метка отделяется двоеточием.
Команды, выполняющие арифметические действия (x - некая целочисленная
переменная или целое число)

add x - добавляет значение x к регистру-аккумулятору
sub x - вычитает значение x из регистра-аккумулятора
Результаты этих операций заносятся в регистр-аккумулятор

pp x - увеличивает значение x на 1
mm x - уменьшает значение x на 1
mov x <число> - присваивает переменной x значение (число целое)
Кроме этих, конечно, есть команды работы с памятью
ld x - загружает значение x в аккумулятор
st x - выгружает значение из аккумулятора в переменную x
Поддерживаются также команды переходов:
jmp <метка> - безусловный переход на оператор с меткой <метка>
cmp x <метка1> <метка2> <метка3> - условный переход:
если x<0, то переход к оператору с меткой <метка1>,
если x=0, то с меткой <метка2>, если x>0, то с меткой <метка3>.
Объявление переменной (а они все целочисленные 32 битовые со знаком)
выглядит так:
decl x
(для каждой переменной требуется писать собственное объявление.
Значение объявленной переменной не определено и в момент начала работы программы может быть любым)
Ваша задача - по заданной программе выяснить, какие значения будут
находиться в переменных по окончании ее выполнения.
Отметим, что программа может завершиться как "естественным" путем,
так и в результате прерывания, если количество тактов выполнения программы
превысит заранее заданное значение. Каждая операции выфполняется 1 такт,
за исключением операции decl, не требующей времени на исполнение.

Формат входного файла input.txt
Первая строка - три целых числа N (0<=N<=1000) - количество строк в программе,
M (1<=M<=10) - количество переменных, значением которых мы будем
интересоваться (в программе может быть объявлено и больше переменных),
S (0<=S<=100000) - максимальное число операций до прерывания программы
Вторая строка - перечисленные через пробел имена переменных (M штук)
Следующие N строк - текст программы (в каждой строке ровно одна команда)
Имя любой переменной - одна буква латинского алфавита (регистр учитывается)

Формат выходного файла output.txt
Первая строка - M целых чисел - значения переменных через пробел
(в последовательности, соответствующей последовательности имен переменных
во входном файле)
Если значение переменной не определено, то вывести UNDEF
В случае, если программа завершилась "аварийным" путем, в выходном файле
присутствует вторая строка, в которой записано слово HALTED

Пример входного файла
8 2 4
x y
decl x
decl y
decl z
ld y
mm y
sub y
st x
mov x 5

Пример выходного файла
1 UNDEF
HALTED

Сдать задачу

Задать вопрос жюри по этой задаче