4장 컴퓨터 구조에 대한 두 번쨰 이야기 (2)

Lamjwi·2023년 12월 28일

Section 02 : LOAD & STORE 명령어 디자인

  • 메인 메모리부터 데이터를 읽어 오거나(Load) 저장(Store)하는 기능과 관련된 명령어를 디자인하면서 레지스터의 필요성에 포커스를 맞춘다.

LOAD & STORE 명령어의 필요성

  • 명령어 디자인하는 과정에서 제약사항
    • "(사칙)연산결과를 레지스터에만 저장할 수 있도록 하겠다."
      • 모든 피연산자에는 메인 메모리의 주소값이 올 수 없다는 제약도 걸어둔것이나 다름없다.
      • 피연산자로 올 수 있는것은 숫자와 레지스터로 제한했기 때문이다.
int a = 10;			// 0x10번지에 할당
int b = 20;			// 0x20번지에 할당
int c = 0;			// 0x30번지에 할당
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 	// 0x10번지에 저장된 데이터를 r1로 이동
LOAD r2, 0x20 	// 0x20번지에 저장된 데이터를 r2로 이동
ADD r3, r1, r2 	// r1, r2에 저장된 값을 더해서 r3에 결과 저장
STORE r3, 0x30 	// 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 모드 활용 예제

  • 세 번째 줄 까지는 이미 완료된 상황이라고 가정.
  • 마지막 연산만 생각하자
    1. 0x0010(a)번지와 0x100(b)번지에 저장되어 있는 값을 각각 레지스터 r1, r2로 이동한다.
      		LOAD r1, 0x0010 // 0x0010번지에 저장된 데이터를 r1로 이동
       		LOAD r2, 0x0100	// 0x0100번지에 저장된 데이터를 r2로 이동	// 문제
    2. 레지스터 r1과 r2에 있는 값을 더해서 레지스터 r3에 저장한다.
    3. 레지스터 r3에 저장된 값을 0x0020(c번지에 저장한다)
  • 두번째 명령어에서 범위를 초과한다. 0x0100은 표현할수 없다.
    • indirect모드로 해결가능.
    • 명령어를 조합해보다보면 턱없이 부족한 명령어 제공으로 불평할수도?
      • 실제로도 RISC CPU는 특성상 충분한 명령어를 제공하지않는다.
      • 그래서 특정 연산을 위해서, 명령어들을 조합할 필요가 있다.
  • 우리가 디자인한 명령어는 사칙연산과 LOAD와 STORE 전부다.

(LOAD r2, 0x0100)대신할 명령어 조합

  • 0x0100은 십진수로 256이니 이숫자를 만드는게 가장 우선
	MUL r0, 4, 4		// r1에는 데이터 0x0010이 저장되어 있으므로 r0에 연산결과 저장
    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

profile
ㅇㅅㅇ

0개의 댓글