Игра процессора
Курсовая работа Васи Пупкина по электронике заключается в создании простого микропроцессора. Согласно заданию, этот микропроцессор имеет только три регистра: аккумулятор, указатель команд и указатель стека. Аккумулятор имеет 60 бит, указатель команд и указатель стека имеют 7 бит. Аккумулятор может хранить положительные и отрицательные числа (в двоичном дополнительном коде: двоичный дополнительный код отрицательного числа равен разности между 260 и абсолютным значением этого отрицательного числа. Например, -5 в десятичном дополнительном коде можно записать как 1152921504606846971, а в двоичном дополнительном коде как 111111111111111111111111111111111111111111111111111111111011).
Процессор может выполнять следующие команды (ACC – аккумулятор, IP – указатель команд, SP – указатель стека, [X] – элемент стека с адресом X):
Программа расположена в ячейках с адресами от 0 до 127. Каждая ячейка памяти может содержать ровно одну команду (включая постоянное значение, если оно существует). Перед началом выполнения аккумулятор устанавливается в значение, которое нужно обработать, а регистры IP и SP обнуляются. Результатом вычисления является значение аккумулятора после остановки программы.
Дана программа для микропроцессора, напишите программу, которая вычисляет её результат для каждого предоставленного значения аккумулятора.
Входные данные
Первая строка содержит два целых числа n и m, разделённых пробелами, где n – количество команд в программе, m – количество значений аккумулятора, для которых нужно произвести вычисления. Последующие n строк содержат команды в следующем формате:
"Адрес ячейки памяти," "пробел" "мнемоника команды" ["пробел", "аргумент."]
Команды перечислены последовательно от ячейки с адресом 0 до ячейки с адресом n-1.
За программой следуют m целых чисел a_i – начальные значения аккумулятора, которые должны быть обработаны микропроцессором. Числа разделены пробелами.
1 ≤ n ≤ 128; 1 ≤ m ≤ 10^3, –2^59 ≤ a_i < 2^59.
Все мнемоники написаны заглавными латинскими буквами, а константа X задаётся в виде десятичного числа (возможно, со знаком) в диапазоне от –2^59 ≤ X < 2^59; для команды CALL 0 ≤ X ≤ 127.
Данная программа имеет конечное время выполнения и никогда не переполняет стек.
Выходные данные
Первая строка выходного файла должна содержать целое число m – количество вычисленных значений. Следующие m строк должны содержать результаты вычислений для входных значений a_i, расположенные в том же порядке, что и a_i, по одному на строку.