8.1 개요
- 중앙처리 장치(CPU) 구성 요소:
CPU는 주로 데이터 처리를 담당하며, 세 가지 주요 부분으로 구성된다.- 레지스터 세트: 명령 실행 중 사용되는 중간 데이터를 저장
- 제어 장치(Control Unit): 레지스터 간 정보 전송을 감독하고 ALU가 수행할 작업을 지시.
- 산술 논리 장치(ALU): 명령 실행에 필요한 미소 연산(microoperation)을 수행
8.2 범용 레지스터 구조
레지스터 사용 이유
- 메모리 접근은 시간이 많이 걸리는 작업이므로, 포인터, 카운터, 반환 주소, 임시 결과 등 중간 데이터를 CPU 레지스터에 저장하는 것이 더 효율적
버스 시스템을 통한 레지스터 연결
- 많은 레지스터를 포함하는 CPU에서는 공통 버스 시스템으로 레지스터를 연결하는 것이 가장 효율적
- 위 그림의 버스 구성: 7개의 CPU 레지스터를 가진 버스 구조
- 레지스터의 출력은 두 개의 멀티플렉서(MUX)에 연결되어 A 및 B 버스를 형성
- 각 멀티플렉서의 선택 라인은 7개 중 1개의 레지스터나 입력 데이터를 고른다.
- A와 B 버스는 산술 논리 장치(ALU)의 입력으로 사용
- ALU는 산술 및 논리 연산을 수행하며, 결과는 출력 버스를 통해 레지스터에 전달
제어 장치의 역할
- 제어 장치는 레지스터와 ALU 간 데이터 흐름을 지시하며, 선택 변수(selection variables)를 통해 작업을 조정
- 예: R1←R2+R3 작업 수행 단계:
- MUX A 선택자(SELA): R2를 A 버스로 전달.
- MUX B 선택자(SELB): R3를 B 버스로 전달.
- ALU 작업 선택자(OPR): A와 B의 덧셈 실행.
- 디코더 선택자(SELD): 출력 버스의 결과를 R1에 저장.
제어 워드(위 그림 참고)
- 제어 워드는 CPU 내 14개의 이진 선택 입력 값을 조합한 것으로, 특정 마이크로 연산을 지정합니다.
- 14비트 제어 워드는 네 개의 필드로 구성됩니다:
- SELA (3비트): ALU의 A 입력에 사용될 소스 레지스터를 선택.
- SELB (3비트): ALU의 B 입력에 사용될 소스 레지스터를 선택.
- SELD (3비트): 출력 데이터를 저장할 목적지 레지스터를 디코더를 통해 선택.
- OPR (5비트): ALU에서 수행할 연산을 선택.
8.3 스택 구조
- 스택은 후입선출(LIFO) 구조를 가지며, 가장 마지막에 저장된 데이터가 먼저 처리
- CPU에서 스택은 메모리와 주소 레지스터로 구성되며, 스택 포인터(SP)가 스택의 최상단 항목을 가리킨다.
스택 연산
- Push: 데이터 삽입
- SP를 증가(또는 감소)시켜 다음 위치를 지정.
- 데이터 레지스터(DR)에서 스택 최상단으로 데이터 쓰기.
- 스택이 가득 찬 경우 FULL 플래그를 1로 설정.
- Pop: 데이터 제거
- 스택 최상단 데이터를 DR로 읽기.
- SP를 감소(또는 증가)시켜 다음 항목을 지정.
- 스택이 비어 있는 경우 EMTY 플래그를 1로 설정.
레지스터 스택
- 고정된 수의 메모리 단어로 구성된 독립적인 스택.
- 아래 그림의 64개의 워드로 구성된 스택의 SP는 6비트 이진수로 표현.
- 스택이 가득 차거나 비어있을 때를 나타내는 FULL과 EMTY 플래그가 존재.
- push 연산: SP를 증가시키고 데이터를 저장. SP가 0에 도달하면 FULL 플래그가 설정.
- pop 연산: SP 위치의 데이터를 읽고 SP를 감소. SP가 0으로 감소하면 EMTY 플래그가 설정.
메모리 스택
- 메모리의 일부를 스택 용도로 사용하며, SP를 통해 주소를 관리
- CPU는 프로그램 카운터(PC), 주소 레지스터(AR), 스택 포인터(SP)를 사용해 메모리에 접근
- 메모리 스택의 SP는 초기 값으로 스택의 하단 주소를 갖고, 푸시 시 감소하거나 팝 시 증가하여 동작(위의 레지스터 스택과 반대로 동작)
역 Polish 표기(후위 표기법)
- 중위 표기법(Infix Notation): 연산자가 피연산자 사이에 위치. 예: A + B
- 전위 표기법(Prefix Notation): 연산자가 피연산자 앞에 위치. 예: + AB
- 후위 표기법(Postfix Notation, Reverse Polish Notation): 연산자가 피연산자 뒤에 위치. 예: AB +
8.4 명령어 형식
주요 구성 요소
- Operation Code (Opcode): 실행할 연산 지정(예: ADD, SUB, MUL 등).
- Address Field: 메모리 주소나 레지스터 주소를 지정.
- Mode Field: 피연산자나 유효 주소를 계산하는 방식 지정.
명령어 형식의 종류 및 CPU 조직
- 단일 누산기 조직(Single Accumulator Organization):
- 명령은 암시적으로 누산기(AC)를 사용.
- 예: ADD X → AC <- AC + M[X]
- 한 개의 주소 필드 사용.
- 범용 레지스터 조직(General Register Organization):
- 여러 프로세서 레지스터를 사용.
- 예: ADD R1, R2, R3 → R1 <- R2 + R3
- 3개의 주소 필드 사용.
- 레지스터 수가 많을수록 효율적인 데이터 처리 가능.
- 스택 조직(Stack Organization):
- 연산은 스택의 최상단 두 항목에 대해 수행.
- 예: PUSH X → 메모리 X의 값을 스택에 푸시.
- 명령은 주소 필드 없이 연산(예: ADD → 스택 상단 두 값 더하기).
3주소 명령어
- 형식: ADD R1, A, B → R1 <- M[A] + M[B]
- 예: X = (A + B) * (C + D)
ADD R1, A, B // R1 = M[A] + M[B]
ADD R2, C, D // R2 = M[C] + M[D]
MUL X, R1, R2 // M[X] = R1 * R2
- 장점: 짧고 간결한 프로그램 작성 가능.
- 단점: 3주소를 지정하려면 많은 비트가 필요
2주소 명령어
- 형식: ADD R1, B → R1 <- R1 + M[B]
MOV R1, A // R1 = M[A]
ADD R1, B // R1 = R1 + M[B]
MOV R2, C // R2 = M[C]
ADD R2, D // R2 = R2 + M[D]
MUL R1, R2 // R1 = R1 * R2
MOV X, R1 // M[X] = R1
- 특징: 일반적으로 사용되는 형식.
- MOV 명령어는 피연산자를 메모리로부터 레지스터로 가져오거나, 레지스터에서 메모리로 전송하는 역할을 한다.
1주소 명령어
- 형식: 누산기(AC)를 사용. ADD B → AC <- AC + M[B]
LOAD A // AC = M[A]
ADD B // AC = AC + M[B]
STORE T // M[T] = AC
LOAD C // AC = M[C]
ADD D // AC = AC + M[D]
MUL T // AC = AC * M[T]
STORE X // M[X] = AC
- 특징: AC를 이용한 간단한 계산. 중간 결과 저장을 위해 메모리 필요
0주소 명령어
- 형식: 스택을 사용. 예: ADD → 스택 상단 두 항목 더하기.
PUSH A // 스택에 M[A] 푸시
PUSH B // 스택에 M[B] 푸시
ADD // 스택: (A + B)
PUSH C // 스택에 M[C] 푸시
PUSH D // 스택에 M[D] 푸시
ADD // 스택: (C + D)
MUL // 스택: (A + B) * (C + D)
POP X // M[X] = 스택 최상단
- 특징: Reverse Polish Notation(RPN) 사용.
RISC (Reduced Instruction Set Computer) 명령어
- 특징: 메모리와 CPU 간에는 LOAD와 STORE만 사용. 모든 계산은 레지스터에서 수행.
LOAD R1, A // R1 = M[A]
LOAD R2, B // R2 = M[B]
ADD R1, R1, R2 // R1 = R1 + R2
LOAD R3, C // R3 = M[C]
LOAD R4, D // R4 = M[D]
ADD R3, R3, R4 // R3 = R3 + R4
MUL R1, R1, R3 // R1 = R1 * R3
STORE X, R1 // M[X] = R1
- 특징: 연산은 모두 레지스터 간에 수행되어 속도가 빠름.
8.5 어드레싱 모드(주소 지정 방식)
어드레싱 모드 기법 사용 목적
- 프로그래밍의 유연성 제공 (포인터, 루프 제어, 데이터 인덱싱 등).
- 명령어의 주소 필드 크기 축소.
기본 컴퓨터 동작 주기
- Fetch (명령어 가져오기): 메모리에서 명령어를 가져옴.
- Decode (명령어 해석): 연산, 주소 지정 방식, 오퍼랜드 위치를 해석.
- Execute (명령어 실행): 명령어 실행 후 다음 명령어로 이동.
주요 주소 지정 방식
1. Implied Mode (암시적 모드)
- 오퍼랜드가 명령어 정의 내에 암시됨.
- 예: Complement Accumulator 명령은 누산기(AC)가 오퍼랜드로 암시됨.
- 특징: 레지스터 참조나 스택 컴퓨터의 0주소 명령어에 사용.
2. Immediate Mode (즉시 모드)
- 오퍼랜드가 명령어 내에 직접 포함.
- 예: 상수를 레지스터에 초기값으로 줄 때 유용
3. Register Mode (레지스터 모드)
- 오퍼랜드가 CPU의 레지스터에 저장.
- 특징: 빠른 접근 가능, k비트로 2^k개의 레지스터 지정 가능.
- 단점: 레지스터 개수가 한정되있음
4. Register Indirect Mode (레지스터 간접 모드)
- 레지스터가 메모리 내 오퍼랜드 주소를 포함.
- 특징: 주소 필드 크기 절약 가능.
5. Autoincrement/Autodecrement Mode(자동증가/ 자동감소 모드)
- 레지스터 간접 모드의 변형. 데이터 접근 후 레지스터 자동 증가/감소.
- 용도: 테이블 데이터 접근 자동화.
6. Direct Address Mode (직접 주소 모드)
- 주소 필드가 오퍼랜드의 실제 메모리 주소를 제공.
- 특징: 단순하지만 주소 필드 크기가 커질 수 있음.
- 단점: 주소 공간이 제한적이다.
7. Indirect Address Mode (간접 주소 모드)
- 주소 필드가 오퍼랜드 주소가 저장된 메모리 위치를 제공.
- 특징: 다단계 메모리 접근 가능.
- 단점: 두번의 메모리 접근이 필요함
8. Relative Address Mode (상대 주소 모드)
- 명령어 주소 필드와 프로그램 카운터(PC) 값을 더해 유효 주소 계산.
- 용도: 분기(branch) 명령에서 주변 주소를 참조할 때 유용.
9. Indexed Addressing Mode (인덱스 주소 지정 모드)
- 주소 필드와 인덱스 레지스터 값을 더해 유효 주소 계산.
- 용도: 배열 내 데이터 접근.
10. Base Register Addressing Mode (기준 레지스터 주소 지정 모드)
- 주소 필드와 기준 레지스터 값을 더해 유효 주소 계산.
- 용도: 프로그램 재배치 시 유용 (기준 레지스터 값만 변경).
주소 지정 방식 비교
어드레싱 모드 | 주소 계산 |
Immediate operand | AR |
Register | R1 |
Register Indirect | M[R1] |
Autoincrement/Autodecrement | R1++/--R1 |
Direct address | AR |
Indirect address | M[AR] |
Relative address | M[AR+PC] |
Indexed address | M[AR+XR] |
8.7 프로그램 제어
무조건 분기: 항상 지정된 주소로 제어권을 전송합니다.
조건부 분기: 지정된 조건이 충족되는 경우에만 제어를 전송합니다(예: 0 또는 양수인 경우 분기).
상태 비트 조건
- 상태 비트(status bit)는 조건 코드(condition code)나 플래그(flag) 등으로 불린다.
- 주요 상태 비트
- 캐리(C): ALU의 출력 캐리가 1이면 1, 0이면 0이 된다.
- 부호(S): ALU의 연산 결과에서 가장 높은 자리의 비트가 1이면 1, 0이면 0이 된다.
- 제로(Z): ALU의 연산 결과를 나타내는 워드의 비트가 0이면 1, 그렇지 않으면 0이다.
- 오버플로(V): C8, C9 캐리의 exclusive-OR 결과가 1이면 1, 그렇지 않으면 0이다. 부호와된 2의 보수로 표시된 숫자의 계산에서 오버플로가 발생하면 1이 된다.
서브루틴 Call과 Return
- 특정 작업을 수행하는 재사용 가능한 코드 블록이다.
- 메커니즘:
- 호출: 제어를 서브루틴으로 전환하고 반환 주소를 저장합니다.
- 반환: 저장된 주소를 PC에 복원합니다.
프로그램 인터럽트
- 정상적인 프로그램의 진행을 벗어나게 하는 여러 가지 문제들을 다룬다.
- 절차:
- 인터럽트는 CPU 상태(예: PC 및 PSW)를 저장
- 이벤트를 처리하기 위해 제어가 서비스 루틴으로 이전
- 실행 후 CPU 상태가 복구되어 중단된 프로그램을 재개
인터럽트의 형태
- 외부 인터럽트: 하드웨어 관련(예: I/O 장치)
- 내부 인터럽트: 소프트웨어 또는 시스템 오류(예: 0으로 나누기).
- 소프트웨어 인터럽트: 특정 지침을 사용하여 프로그래밍 방식으로 트리거
8.8 간소화된 명령어 집합 컴퓨터
CISC 아키텍처의 특징
- 명령어 집합: 100~250개의 명령어로 구성되며, 일부는 특수 작업에 사용.
- 주소 지정 모드: 5~20개의 다양한 주소 지정 모드 제공.
- 가변 길이 명령어 형식: 명령어 길이가 고정되어 있지 않음.
- 메모리 접근: 메모리에 있는 피연산자를 직접 조작 가능.
- 목적: 고급 언어의 컴파일을 단순화하고 성능 향상.
CISC는 고급 언어의 각 문장을 하나의 기계어 명령으로 처리하려는 목표로 설계되었다. 하지만 명령어 복잡성 증가로 인해 하드웨어 구현 비용과 처리 속도 문제가 발생할 수 있다.
RISC 아키텍처의 특징
- 명령어 집합: 비교적 적은 수의 명령어 제공.
- 주소 지정 모드: 소수의 단순한 주소 지정 모드만 사용.
- 메모리 접근: 메모리 접근은 로드 및 저장 명령으로 제한.
- 연산 방식: 모든 연산은 CPU 레지스터 내에서 수행.
- 고정 길이 명령어 형식: 명령어가 고정된 길이를 가지며 디코딩이 간단.
- 단일 사이클 실행: 명령어 하나를 한 클록 사이클 내에 실행.
- 하드웨어 제어: 마이크로프로그램 방식이 아닌 하드와이어드 방식 사용.
RISC는 단순한 명령어 세트를 통해 실행 시간을 단축하고 효율적인 파이프라이닝과 레지스터 활용을 가능하게 한다.
중첩 레지스터 윈도우
- RISC는 중첩 레지스터 윈도우를 활용해 절차 호출 및 반환 시 레지스터 저장/복원의 필요성을 줄이고 매개변수 전달을 효율화합니다.
- 각 프로시저는 독립적인 레지스터 집합을 할당받으며, 인접 프로시저 간에는 일부 레지스터를 공유하여 데이터 이동을 최소화합니다.
- 예: A 프로시저에서 B를 호출할 때, B는 A의 상위 레지스터를 사용해 매개변수를 전달받고 결과를 반환.
- 위 그림의 끝과 끝은 연결되어 있다.
- 전역 레지스터 수 =G
- 각 윈도우에서 지역 레지스터의 수 = L
- 두 윈도우에 공통인 레지스터의 수 = C
- 윈도우의 수 = W
- 윈도우 크기 = L + 2C + G
- 레지스터 파일 = (L + C)*W + G
- 위 그림에서 G = 10, L = 10, C = 6, W = 4이다.
따라서 윈도우 크기는 10 + 12 + 10 = 32, 레지스터 파일은 (10 + 6) * 4 + 10 = 74
'Mano의 컴퓨터시스템구조' 카테고리의 다른 글
[mano의 컴퓨터시스템 구조] 9장 파이프라인과 벡터 처리 (1) | 2025.02.02 |
---|---|
[mano의 컴퓨터시스템 구조] 7장 마이크로 프로그램된 제어 (0) | 2025.01.05 |
[mano의 컴퓨터시스템 구조] 6장 기본 컴퓨터 프로그래밍 (1) | 2024.12.16 |
[mano의 컴퓨터시스템 구조] 5장 기본 컴퓨터의 구조와 설계 (0) | 2024.11.27 |
[mano의 컴퓨터시스템 구조] 4장 레지스터 전송과 마이크로 연산 (0) | 2024.11.21 |