만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

CPU

시간 제한1초메모리 제한512 MB

요약
16비트 CPU의 어셈블리 명령어 N개를 읽어, 각 명령어를 비트 위치에 맞춰 16비트 기계어로 출력합니다.
난이도

쉬움10점 중 2점

유형
구현, 문자열
정답자
아직 제출이 없습니다

문제

디지털하드웨어설계 과목의 최종 프로젝트는 16-bit CPU를 설계하고 Verilog 언어로 구현하는 것이다. 구현한 CPU가 제대로 동작하는지 테스트하려면 기계어 코드를 입력으로 주어야 한다. 하지만 0과 1로만 이루어진 기계어 코드는 이해하기 어려워서, 대부분의 사람은 C++, Java 같은 프로그래밍 언어로 코드를 작성하고 컴파일러로 기계어 코드로 번역한다.

여러 프로그래밍 언어 중에서 어셈블리어는 사람이 이해하기 쉬우면서 기계어와 가장 유사한 언어이다. 어셈블리어 코드는 어셈블러로 기계어 코드로 번역된다. 어셈블리어는 기계어와 일대일로 대응한다. 예를 들어, 두 수의 합을 구하는 연산의 어셈블리어 코드가 ADD이고 기계어 코드가 00000이면, 어셈블러는 ADD를 읽어 그대로 00000으로 바꾼다.

아래 표는 민호가 설계한 CPU가 처리할 수 있는 16-bit 단위 명령어의 구조를 정리한 것이다.

입력과 출력은 항상 명령어 단위이다. 어셈블리어 코드는 "opcode rD rA rB" 또는 "opcode rD rA #C" 형태이다. 보통은 레지스터 rA와 rB에 있는 두 수, 또는 레지스터 rA에 있는 수와 상수 #C에 opcode가 뜻하는 연산을 수행하고, 그 결괏값을 레지스터 rD에 저장한다. opcode에 따라서는 rA를 사용하지 않을 수도 있다. 어셈블러는 opcode, rD, rA, rB, #C를 각 bit 자리에 맞춰 0과 1로 이루어진 16-bit 기계어 코드로 번역한다. 각 bit의 의미는 다음과 같다.

  • 0~4: CPU가 수행할 연산을 나타내는 opcode이다. 4번 bit가 0이면 레지스터 rB를, 1이면 상수 #C를 사용한다.
  • 5: 사용하지 않는 bit이며 항상 0이다.
  • 6~8: 결괏값을 저장하는 레지스터 rD의 번호이다.
  • 9~11: 연산에 쓰이는 레지스터 rA의 번호이다. 사용하지 않으면 000이다.
  • 12~15: 4번 bit가 0이면 12~14번 bit는 연산에 쓰이는 레지스터 rB의 번호이고 15번 bit는 항상 0이다. 4번 bit가 1이면 12~15번 bit는 상수 #C이다.

입력

첫 번째 줄에 명령어의 개수 N (1 ≤ N ≤ 500)이 주어진다.

다음 N개의 줄에는 명령어가 "opcode rD rA rB" 또는 "opcode rD rA #C" 형태의 어셈블리어 코드로 주어진다. opcode는 항상 대문자이다. 레지스터 번호 rD, rA, rB (0 ≤ rD, rA, rB ≤ 7)는 1부터 7까지를 사용하며, 사용하지 않는 경우에만 0이 주어진다. 상수 #C (0 ≤ #C ≤ 15)는 상수이다.

출력

N개의 줄에 각 어셈블리어 코드를 16-bit 기계어 코드로 번역하여 출력한다.

예제2

  1. 예제 1

    입력
    4
    MOVC 1 0 5
    MOVC 2 0 10
    ADD 3 1 2
    SUB 4 1 2
    
    예상 출력
    0010100010000101
    0010100100001010
    0000000110010100
    0001001000010100
    
  2. 예제 2

    입력
    8
    LSFTL 4 2 4
    MULTC 3 7 12
    NOT 2 0 4
    SUB 4 4 3
    ASFTR 6 4 1
    MULT 7 7 5
    RLC 6 4 14
    RR 1 5 4
    
    예상 출력
    0111001000101000
    0110100111111100
    0101000100001000
    0001001001000110
    1001001101000010
    0110001111111010
    1010101101001110
    1011000011011000