[인프런 워밍업 클럽 4기 - CS] - 3주차 미션 (컴퓨터 구조)

[인프런 워밍업 클럽 4기 - CS] - 3주차 미션 (컴퓨터 구조)

문제

  1. STOREB(1001) 명령어를 만들어보세요.

(OPcode는 1001이고 operand가 가리키는 RAM주소에 현재 레지스터B의 데이터 저장하는 기능)

1. operand 를 MAR에 저장하기 위해 IO와 MI 활성화

image

 

  1. 레지스터 B의 데이터를 램에 저장하기 위해 BO과 RI을 활성화

image

  1. STOREB(1001) 명령어 작업

image 

  1. 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의 값은 수동으로 혹은 다른 기능에 의해 삽입해야하지 않을까 싶다.

 

후기

미션을 제대로 수행했는지 감도 안잡힐 정도로 개념이 어려웠던 것 같다. 사실 미션은 다 틀린 것 같은데 최대한 아는 내용에서 머리를 굴려서 문제를 풀었던 것 같다 😅 그럼에도 개념을 계속 복습하면서 문제를 풀어서 제출하는 것에 의의를 두었고 처음 어셈블리어까지 혹은 컴퓨터 회로 구조까지 내려가면서 딥하게 볼 수 있어서 더 인상 깊었던 로드맵이었고 현재는 나에게 크게 와닿지는 않겠지만 나중에 업무를 하며 분명히 나에게 도움이 될 때가 올 것이라고 확신할 수 있을 것 같다 :)

댓글을 작성해보세요.

채널톡 아이콘