마이크로프로세서 시뮬레이션

아직 제출이 없습니다시간 제한1초메모리 제한128 MB

문제

다음과 같은 특징을 가진 작은 마이크로프로세서를 생각하자.

  • 워드(word) 는 4비트다.
  • 주소는 두 워드로 이루어지며, 항상 상위 워드가 먼저 온다. 즉, 두 워드짜리 주소의 상위 워드는 메모리에서 언제나 더 낮은 주소(앞쪽 워드)에 놓인다.
  • 메모리는 256워드다.
  • 누산기(accumulator)는 A와 B 두 개가 있으며, 각각 한 워드를 저장한다.
  • 명령어 코드는 아홉 개다. 각 명령어는 명령을 나타내는 코드를 저장하기 위해 최소 한 워드를 사용한다. 이 중 네 개의 명령어는 인수(argument)를 가지며 추가로 두 워드를 더 사용한다.

4비트 수는 10진수로 0부터 15까지의 값을 가질 수 있다. 이를 통상적인 방식의 16진수로 표기한다. 즉, A는 10, B는 11 등을 뜻한다.

아홉 개의 명령어는 다음과 같다.

코드워드 수설명
03LD: 인수로 지정된 메모리 주소의 값을 누산기 A에 적재한다.
13ST: 누산기 A의 값을 인수로 지정된 메모리 주소에 기록한다.
21SWP: 누산기 A와 B의 값을 서로 맞바꾼다.
31ADD: 누산기 A와 B의 값을 더한다. 합의 하위 워드는 A에, 상위 워드는 B에 저장한다.
41INC: 누산기 A를 1 증가시킨다. 오버플로가 허용된다. 즉, F를 증가시키면 0이 된다.
51DEC: 누산기 A를 1 감소시킨다. 언더플로가 허용된다. 즉, 0을 감소시키면 F가 된다.
63BZ: 누산기 A가 0이면 다음에 실행할 명령을 인수로 지정된 주소의 명령으로 삼는다. A가 0이 아니면 인수를 무시하고 아무 일도 일어나지 않는다.
73BR: 다음에 실행할 명령을 인수로 지정된 주소의 명령으로 삼는다.
81STP: 프로그램 실행을 멈춘다.

마이크로프로세서는 항상 주소 00에 있는 명령부터 실행을 시작한다. 정지(STP) 명령을 만날 때까지 명령을 순서대로 실행한다.

아래 예시는 일부 프로그램과 그 동작을 보여 준다.

프로그램설명
01A8메모리 주소 1A(10진수로 26)의 값을 누산기 A에 적재하고 정지한다.
01A512F8메모리 주소 1A(10진수로 26)의 값을 누산기 A에 적재하고, 1 감소시킨 뒤, 그 결과를 메모리 주소 2F에 저장하고 정지한다.

입력

입력은 정확히 256개의 16진수 문자로 이루어진 여러 줄로 구성된다. 각 줄은 주소 00에서 시작하여 주소 FF에서 끝나는 메모리의 내용이다. 입력의 끝은 주소 00에 정지 명령(문자 "8")이 놓인 메모리 상태로 표시된다. 입력으로 주어지는 프로그램은 결코 "메모리의 끝을 벗어나지" 않는다. 즉, 주소 F0부터 FF까지(양 끝 포함)에 위치한 명령을 실행하는 일은 없다.

출력

각 메모리 상태에 대해, 주소 00부터 실행을 시뮬레이션한다. 정지 명령에 도달하면 메모리의 내용을 256개의 16진수 문자로 이루어진 하나의 문자열로 출력하고, 그 뒤에 줄바꿈 문자를 덧붙인다.