![[인프런 워밍업 클럽 4기 - CS] - 3주차 미션 (컴퓨터 구조)](https://cdn.inflearn.com/public/files/blogs/9c38530c-2342-4196-995c-5ee644920855/337244.png)
[인프런 워밍업 클럽 4기 - CS] - 3주차 미션 (컴퓨터 구조)
문제
STOREB(1001) 명령어를 만들어보세요.
(OPcode는 1001이고 operand가 가리키는 RAM주소에 현재 레지스터B의 데이터 저장하는 기능)
1. operand 를 MAR에 저장하기 위해 IO와 MI 활성화
레지스터 B의 데이터를 램에 저장하기 위해 BO과 RI을 활성화
STOREB(1001) 명령어 작업
A와 B를 비교해서 A와 B가 같으면 0, A가 더 크면 1, B가 더 크면 2를 출력 레지스터에 출력하는 어셈블리어를 작성해보세요.
JMPC
는 A < B일 때 점프, JMPZ
는 A == B일 때 점프해주는 명령어이기 때문에 각 분기로 나눠 실행할 명령어 코드로 점프를 시켜줬고 하위에는 값 A, B와 결과를 담을 상수(0, 1, 2)를 저장해주었다.
LOADA 15 // A 값
SUB 14 // A - B
JMPC 7 // A < B, 7번 코드 실행
JMPZ 9 // A == B, 9번 코드 실행
LOADA 12 // A > B, 값 1 출력
OUT
HLT
LOADA 13 // 값 2 출력
OUT
LOADA 11 // 값 0 출력
OUT
0 // A == B 출력값
1 // A > B 출력값
2 // A < B 출력값
7 // 값 B
7 // 값 A
하지만 상위 코드에는 치명적인 문제점이 있다.
A > B일 경우에는 OUT 레지스터에 값을 출력하고 프로그램을 종료시키는데, 그 외의 경우는 OUT만 시켜주고 프로그램을 종료시키지 않다보니 무한 루프가 돌게 되며 처음에는 올바른 결과가 출력되다가 루프를 통해 결과값이 바뀌게 된다.
그래서 아마 문제에선 A,B 값이 주어지지 않았으니
LOADA 15 // A 값
SUB 14 // A - B
JMPC 7 // A < B, 7번 코드 실행
JMPZ 9 // A == B, 9번 코드 실행
LOADA 12 // A > B, 값 1 출력
OUT
HLT
LOADA 13 // 값 2 출력
OUT
HLT
LOADA 11 // 값 0 출력
OUT
HLT
0 // A == B 출력값
1 // A > B 출력값
2 // A < B 출력값
이렇게 각 조건마다 프로그램을 종료시키는 명령어를 넣고, A와 B의 값은 수동으로 혹은 다른 기능에 의해 삽입해야하지 않을까 싶다.
후기
미션을 제대로 수행했는지 감도 안잡힐 정도로 개념이 어려웠던 것 같다. 사실 미션은 다 틀린 것 같은데 최대한 아는 내용에서 머리를 굴려서 문제를 풀었던 것 같다 😅 그럼에도 개념을 계속 복습하면서 문제를 풀어서 제출하는 것에 의의를 두었고 처음 어셈블리어까지 혹은 컴퓨터 회로 구조까지 내려가면서 딥하게 볼 수 있어서 더 인상 깊었던 로드맵이었고 현재는 나에게 크게 와닿지는 않겠지만 나중에 업무를 하며 분명히 나에게 도움이 될 때가 올 것이라고 확신할 수 있을 것 같다 :)
댓글을 작성해보세요.