16비트 단순 명령어 컴퓨터(CPU16) 시뮬레이터입니다.
본 프로젝트는 시스템 소프트웨어 기말 과제로, 16비트 CPU와 4096바이트 메모리를 시뮬레이션하는 프로그램입니다. 콘솔에서 어셈블리 코드를 입력받아 실시간으로 실행하고 메모리 상태를 확인할 수 있습니다.
- ALU (Arithmetic Logic Unit): 산술 연산 수행 (ADD, MUL, DIV, MOD)
- CU (Control Unit): 명령어 해독 및 실행 제어
- PC (Program Counter): 다음 실행할 명령어 주소 저장
- IR (Instruction Register): 현재 실행 중인 명령어 저장
- AC (Accumulator): 연산 결과 저장
- 크기: 4096 bytes (0x000 ~ 0xFFF)
- 16비트 단위 읽기/쓰기 지원
- Big Endian 방식 저장
| 명령어 | Opcode | 동작 |
|---|---|---|
| LDA x | 0000 | AC ← Memory[x] |
| STA x | 0001 | Memory[x] ← AC |
| ADD x | 0010 | AC ← AC + x |
| MUL x | 0011 | AC ← AC × x |
| DIV x | 0100 | AC ← AC ÷ x |
| MOD x | 0101 | AC ← AC % x |
| SEA x | 1111 | AC ← x |
| 15-12 (4bit) | 11-0 (12bit) |
| opcode | operand |
make
./cpu16- 새 프로젝트 생성 (빈 프로젝트 또는 콘솔 앱)
- 소스 파일 추가:
main.cpp,Memory.cpp,CPU16.cpp - 헤더 파일 추가:
Memory.h,Register.h,ALU.h,CU.h,CPU16.h,Assembler.h - 빌드 (Ctrl + Shift + B) 후 실행 (Ctrl + F5)
g++ -std=c++17 -o cpu16 main.cpp Memory.cpp CPU16.cppCPU16> load 0
Enter assembly code (type 'END' to finish):
> SEA 7EF
> ADD 4
> MUL 40
> STA 8
> END
CPU16> run 0 6
CPU16> prepare 0 6
CPU16> step
CPU16> step
...
CPU16> dump 0 f # 16진수로 출력
CPU16> dumpbin 0 7 # 2진수로 출력
CPU16> dumpall # 전체 메모리 출력
CPU16> read 8 # 특정 주소 읽기
CPU16> reg
(실행 후 help 명령어를 통해서도 확인할 수 있습니다)
| 명령어 | 설명 |
|---|---|
load [addr] |
콘솔에서 어셈블리 코드 입력 |
loadfile <file> [addr] |
파일에서 프로그램 로드 |
run <start> <end> |
프로그램 실행 |
prepare <start> <end> |
단계별 실행 준비 |
step 또는 s |
명령어 한 줄 실행 |
dump [start] [end] |
메모리 보기 (16진수) |
dumpbin [start] [end] |
메모리 보기 (2진수) |
dumpall [bin] |
전체 메모리 보기 |
read <addr> |
특정 주소 읽기 |
write <addr> <val> |
특정 주소에 쓰기 |
clear [addr] |
메모리 초기화 |
reg |
레지스터 상태 출력 |
ptr [addr] |
메모리 포인터 확인/설정 |
verbose <on|off> |
실행 과정 출력 설정 |
test |
필수 테스트 프로그램 실행 |
test2 |
DIV/MOD 테스트 프로그램 실행 |
help |
도움말 |
exit |
종료 |
SEA 7EF # AC = 0x7EF (2031)
ADD 4 # AC = 0x7EF + 0x4 = 0x7F3 (2035)
MUL 40 # AC = 0x7F3 * 0x40 = 0xFCC0 (64704)
STA 8 # Memory[0x8] = 0xFCC0
SEA 64 # AC = 100
DIV A # AC = 100 / 10 = 10
STA 10 # Memory[0x10] = 10
SEA 65 # AC = 101
MOD A # AC = 101 % 10 = 1
STA 12 # Memory[0x12] = 1
cpu16_project/
├── main.cpp # 메인 프로그램 및 쉘 인터페이스
├── Memory.h # 메모리 클래스 헤더
├── Memory.cpp # 메모리 클래스 구현
├── CPU16.h # CPU 클래스 헤더
├── CPU16.cpp # CPU 클래스 구현
├── Register.h # 레지스터 클래스 (PC, IR, AC)
├── ALU.h # ALU 클래스
├── CU.h # CU 클래스
├── Assembler.h # 어셈블러 클래스
├── Makefile # 빌드 설정
└── README.md # 프로젝트 설명
- C++17
- g++ / Visual Studio