빠른 디버거
시간 제한1초메모리 제한2048 MB
네 개의 8비트 레지스터에 대한 비트 연산과 중첩 반복문으로 이루어진 프로그램에서, 처음 k개 명령을 실행한 뒤의 레지스터 값을 구합니다.
문제
최근 오래된 컴퓨터를 한 대 받았습니다. 이 컴퓨터는 8비트 CPU를 사용하고, 레지스터는 ax, bx, cx, dx 네 개입니다. 지원하는 명령어는 몇 가지 단순한 것뿐입니다. 어셈블리 언어에 익숙하지 않은 분을 위해 간단히 설명을 덧붙입니다.
각 레지스터는 8비트이며, 값은 범위의 정수로 볼 수 있습니다.
이 CPU는 비트 OR, 비트 AND, 비트 XOR 세 가지 비트 연산을 지원합니다. 각 연산에는 두 종류의 명령어가 있습니다.
1형은 두 피연산자가 모두 레지스터입니다. or r1 r2 형태로 쓰며, r1과 r2는 각각 ax, bx, cx, dx 중 하나입니다. 두 레지스터가 같은 레지스터일 수 있습니다. 이 명령어는 r1의 값을 r1과 r2의 비트 OR 결과로 바꿉니다. AND와 XOR 명령어는 and r1 r2, xor r1 r2로 씁니다.
2형은 피연산자 하나가 즉시값입니다. ori r imm 형태로 쓰며, r은 레지스터이고 imm은 명령어에 주어지는 범위의 상수입니다. 이 명령어는 r의 값을 r과 imm의 비트 OR 결과로 바꿉니다. AND와 XOR 버전은 andi r imm, xori r imm입니다.
어셈블러는 간단한 반복문을 지원합니다. repeat m 문을 만나면 repeat 블록의 내용을 총 번 실행합니다. 형식은 다음과 같습니다.
repeat m
<repeat block>
end
여기서 은 범위의 상수입니다. <repeat block>은 하나 이상의 문으로 이루어지며, 각 문은 비트 연산 명령어이거나 중첩된 repeat-end 문입니다.
여러분은 이 CPU의 시뮬레이터를 작성합니다. 올바른 프로그램과 개의 질의가 주어집니다. 각 질의는 다섯 정수 로 이루어집니다. 처음에 ax , bx , cx , dx 로 설정합니다. 프로그램이 비트 연산 명령어를 개 실행한 뒤의 네 레지스터 값을 출력하세요.
입력
첫 줄에 명령어 개수 과 질의 개수 가 주어집니다 (, ).
이어서 개의 줄에 위에서 설명한 형식의 명령어가 한 줄씩 주어집니다.
다음 개의 줄에는 다섯 정수 가 주어집니다 (, ). 프로그램은 비트 연산 명령어를 개 실행하기 전에 종료되지 않는다고 보장됩니다.
출력
개의 줄을 출력합니다. 번째 줄에는 프로그램이 비트 연산 명령어를 개 실행한 뒤의 ax, bx, cx, dx 값인 네 정수 를 출력합니다.