들어가며
소프트웨어를 구현할 때 성능 최적화나 안정성을 높이려면, 단순히 고수준 코드만 신경 쓰는 것을 넘어 하드웨어가 데이터를 어떻게 다루고 연산을 수행하는지 이해하는 것이 중요합니다. 특히 이번 주차처럼 CPU의 명령어를 확장하거나 분기 로직을 직접 구현해 보면, 코드 한 줄이 내부에서 어떤 신호 흐름과 제어 단계로 이어지는지 명확히 볼 수 있습니다. 이를 통해 실제 시스템에서 병목을 줄이고 디버깅할 때에도 어디를 점검해야 할지 알게 되므로, 앞으로 더 복잡한 기능을 다룰 때 큰 도움이 됩니다.
이번 스터디 미션은 ALU나 메모리 구성 요소를 직접 설계하고 검증했던 경험을 바탕으로, 레지스터 B 저장 명령어를 추가하고 A·B 비교 어셈블리어를 작성해 보았습니다. 이 글에서는 STOREB 명령어 확장과 A·B 비교 로직 구현 과정을 정리하고, 검증 결과와 인사이트를 공유합니다.
미션1. STOREB(1001) 명령어를 만들기
목표
- OPcode는 1001이고 operand가 가리키는 RAM주소에 현재 레지스터B의 데이터 저장하는 기능 만들기
개요
- OPcode가 1001일 때 STOREB 경로로 분기하도록 추가합니다.
- 내부 구현 세부는 이전 STOREA 경험을 참고하여 만들었습니다.

검증
- 스텝 카운터가 각 단계에 진입할 때, STOREB 신호와 연관된 핀들이 의도한 타이밍에 활성화되는지 확인.
느낀점
- Logisim에서 결과를 직접 눈으로 확인하면서, 연결이 제대로 됐음을 직관적으로 이해할 수 있었습니다.
미션2. A·B 비교 어셈블리어 작성
목표
- A 값과 B 값을 비교해, 같으면 0, A > B면 1, A < B면 2를 출력 레지스터에 출력하는 어셈블리어를 작성하고 동작을 확인.
코드
- 메모리 주소
- 0~10: 비교 로직 명령어
- 11~13: 여유
- 14: A 값
- 15: B 값
LOADA 14 // A = RAM[14]
SUB 15 // A -= RAM[15]
JMPC 5 // CF = 1 → A ≥ B일 때 5번 주소로 점프
LOADI 2 // A < B → 결과 2
JMP 9 // 결과 출력으로 점프
JMPZ 8 // ZF = 1 → A = B일 때 8번 주소로 점프
LOADI 1 // A > B → 결과 1
JMP 9 // 결과 출력으로 점프
LOADI 0 // A = B → 결과 0
OUT // 결과 출력
HLT // 프로그램 종료
0
0
0
7 // A값
3 // B값
ASM- SUB 후 플래그를 이용한 분기 순서
- A<B: SUB 결과에서 CF=0 → JMPC 미분기 → LOADI 2 → OUT에서 2 출력
- A≥B: CF=1 → JMPC 분기 → JMPZ로 ZF 검사
- A=B: ZF=1 → LOADI 0 → OUT에서 0 출력
- A>B: ZF=0 → LOADI 1 → OUT에서 1 출력

검증
- RAM[14], RAM[15]에 다양한 조합(A < B, A = B, A > B) 값을 넣고 실행.
- 출력 레지스터 값이 기대치(0 / 1 / 2)와 일치하는지 확인.
- 반복 테스트를 통해 “어떤 값 조합에서도 예상 결과가 나오는” 것을 확인했습니다.
A = 7 , B = 3 값을 넣고 실행한 결과 이미지


느낀점
- 분기 순서나 주소를 잘못 지정하면 엉뚱한 결과가 나오므로, 주소 계산과 JMP/ JMPC 위치를 차분히 검토하는 과정이 중요했습니다.
- Logisim에서 PC 흐름과 OUT 값을 함께 보면서 디버깅하니, 코드 구조를 머릿속에 이해하기 쉬웠습니다.
- 어셈블리어가 비교 로직을 깔끔하게 표현할 수 있음을 체감했고, 플래그 기반 분기 설계 원칙이 익숙해졌습니다.
마치며
이번 주차에는 STOREB 명령어를 추가해보면서 제어 신호 흐름을 이해하고, A·B 비교 로직을 플래그 기반 분기로 구현하며 분기 주소와 플래그 활용에 익숙해질 수 있었습니다. Logisim에서 단계별로 신호와 흐름을 직접 확인하면서, 작은 기능 하나하나가 내부에서 어떻게 작동하는지 체감할 수 있었습니다. 앞으로도 이 과정에서 얻은 제어 흐름 설계 원칙과 디버깅 습관을 바탕으로 더 복잡한 명령어나 연산 로직을 구현할 때 도움이 될 것 같습니다. 감사합니다!