Section 02 : LOAD & STORE 명령어 디자인
- 메인 메모리부터 데이터를 읽어 오거나(Load) 저장(Store)하는 기능과 관련된 명령어를 디자인하면서 레지스터의 필요성에 포커스를 맞춘다.
LOAD & STORE 명령어의 필요성
- 명령어 디자인하는 과정에서 제약사항
- "(사칙)연산결과를 레지스터에만 저장할 수 있도록 하겠다."
- 모든 피연산자에는 메인 메모리의 주소값이 올 수 없다는 제약도 걸어둔것이나 다름없다.
- 피연산자로 올 수 있는것은 숫자와 레지스터로 제한했기 때문이다.
int a = 10;
int b = 20;
int c = 0;
c = a + b;
"-0x10번지(a)에 저장된 값과 0x20번지(b)에 저장된 값을 더해서 0x30번지(c)에 저장해라"
- 같은 개소리 코드는 안된다.
- 메인 메모리 주소 정보를 사칙연산의 피연산자로 올 수 있도록 명령어 구조를 설계하지 않았기 때문에 주소 연산은 사칙연산으로 못한다.
- 메인 메모리에 저장된 데이터를 레지스터로 일단 옮겨다 놓은 다음에, 덧셈을 진행해야 한다.

- LOAD 명령어
- 메인 메모리에 저장된 데이터를 레지스터로 이동시킨다.
- STORE 명령어
- 레지스터에 저장된 데이터를 메인 메모리로 이동시킨다.
LOAD & STORE 명령어 디자인

- LOAD 심볼 110
- 사칙 연산명령어에 비해서 피연산자가 두 개(메인 메모리 정보, 레지스터 정보)면 된다.
- 이진코드 110으로 정의
- 목적지 정보와 데이터가 존재하는 위치 정보 담도록 디자인
- 목적지 : 레지스터 정보를 담을 수 있도록 정의
- 데이터 : 메모리 주소 정보가 올 수 있도록 정의
- LOAD r3, 0x07 디자인된다.
- "0x07번지에 존재하는 데이터를 레지스터 r3에 저장하라."


- STORE 심볼
- 이진코드로 111 정의
- 목적지와 데이터가 존재하는 위치 정보 담도록 디자인.
- 목적지 : 메모리 주소 정보가 올 수 있도록 정의
- 데이터 : 레지스터 정보를 담을 수 있도록 정의
- STORE r2, 0x08
- "레지스터 r2에 존재하는 데이터를 메인 메모리 0x08번지에 저장하라."


c = a + b
- 이 연산만 남앗는데 이걸 지금까지 디자인한 걸로 바꾸면
LOAD r1, 0x10
LOAD r2, 0x20
ADD r3, r1, r2
STORE r3, 0x30
- 덧셈 연산의 피연산자는 숫자이거나 레지스터라고 정의햇는데 우리가 지금 머리가 아픔
- 해결책
- 피연산자가 레지스터가 되게끔 하기 위해서 메모리에 저장된 값을 레지스터에 옮겨다 놓은 후 덧셈 연산을 하면 된다.

Section 03 : Direct 모드와 Indirect 모드
- 지금까지 16비트로 디자인된 명령어에다가 많은 정보를 담도록 디자인 햇다.
- but 문제가 하나 있다.
Direct 모드의 문제점과 Indirect 모드의 제안

- 하나의 명령어에 여러 정보를 담다 보니 표현하는 데이터 크기에 제한이 따른다는 문제점이 발생
- 4-10을 보면 LOAD 명령어를 보면, 세 개의 비트수로 표현되는 destination 부분은 문제가 없으나 이곳에서 데이터를 저장할 레지스터 정보가 오게 되는데, 레지스터 개수가 총 8개라 문제 발생 x
- but 메인 메모리의 주소값을 나타내는 source 부분에서 문제 발생
- 표현할수 있는 값의 범위가 0x0000 ~ 0x00ff까지가 전부이기 때문이다.
- 0x0100번지를 데이터를 참조하고자하면 문제가 발생.
- Direct(직접) 모드
- 지금까지 우리가 언급한 메모리 접근방법.
- 메모리의 모든 영역에 대한 접근이 불가능하다.
- 메모리 접근할 경우, 할당된 비트 수 안에서 표현 가능한 범위의 메모리 영역만 접근이 가능하기 때문이다.
- 주소값을 명령어에 직접 표현하기 때문에 Direct 모드라 한다.

Indirect 모드의 이해

- Indirect모드의 등장은 메모리 접근방법에 다양성을 부여함.

- 명령어에서 지정하는 번지에 저장된 값을 주소값으로 참조하게 된다.
- 4.16을 보면 0x10을 []기호로 감싸고 있다
- Indirect모드로 메모리를 참조하는 명령어 구성을 위해서 정의해 놓은 기호다.
- 4-9를 보면 source에 저장된 주소값이 Direct모드인지?Indirect모드인지 구분할수 엇다.
- 구분하기위해서는 추가적인 비트가 필요하다.
- 첫비트 2개의 용도 아직 정하지않았으므로 여길 활용하면 된다.

- 지금가지 LOAD기준으로 Indirect설명했다
- STORE에도 동일하게 적용된다.

Indirect 모드 활용 예제

- 세 번째 줄 까지는 이미 완료된 상황이라고 가정.
- 마지막 연산만 생각하자
- 0x0010(a)번지와 0x100(b)번지에 저장되어 있는 값을 각각 레지스터 r1, r2로 이동한다.
LOAD r1, 0x0010
LOAD r2, 0x0100
- 레지스터 r1과 r2에 있는 값을 더해서 레지스터 r3에 저장한다.
- 레지스터 r3에 저장된 값을 0x0020(c번지에 저장한다)
- 두번째 명령어에서 범위를 초과한다. 0x0100은 표현할수 없다.
- indirect모드로 해결가능.
- 명령어를 조합해보다보면 턱없이 부족한 명령어 제공으로 불평할수도?
- 실제로도 RISC CPU는 특성상 충분한 명령어를 제공하지않는다.
- 그래서 특정 연산을 위해서, 명령어들을 조합할 필요가 있다.
- 우리가 디자인한 명령어는 사칙연산과 LOAD와 STORE 전부다.
(LOAD r2, 0x0100)대신할 명령어 조합
- 0x0100은 십진수로 256이니 이숫자를 만드는게 가장 우선
MUL r0, 4, 4
MUL r2. 4. 4
MUL r3, r0, r2
- r0에 MUL명령어 사용해서 16저장, r2도 MUL명령어 사용해서 16저장
- r0과 r2를 곱해서 결과(256)을 r3에 저장한다.
- 쉬운 생각
LOAD r2, r3
- 틀림
- LOAD 명령어 디자인
- r3의 위치에는 메모리의 주소 정보가 와야 한다.
- 두번째 피연산자 위치(현재 r3가 있는 위치)에는 반드시 주소 정보가 와야한다.
- Indirect모드로 다시 생각하자
- 문제 : r3에 저장된 주소값을 참조하여 메모리로부터 값을 읽어다가 레지스터 r2에 저장하는 것
- r3에 저장된 주소 데이터를 다시 메인 메모리로 옮겨다 놓는다
- STORE 명령어로 표현할수 있는 범위여야 하니까 0x0030을 선택
STORE r3, 0x0030
- 메인 메모리를 Indirect모드로 참조해서 값을 읽어오도록 LOAD명령어 구성
LOAD r2, [0x0030]
LOAD r1, 0x0010
MUL r0, 4, 4
MUL r2. 4. 4
MUL r3, r0, r2
STORE r3, 0x0030
LOAD r2, [0x0030]
ADD r3, r1, r2
1차 24.01.02
2차 24.01.03
3차 24.01.04
4차 24.01.05
5차 24.01.09