ARCHITECTURE

[아키텍처] 명령어 형식과 주소지정 방식

ch010104 2025. 4. 2. 15:57

1.  명령어 형식 (Instruction Format)

 

1) 명령어란?

CPU가 수행할 명령의 집합으로, 다음과 같은 정보를 포함하고 있어야 함.

  1. 연산 코드(Opcode): 수행할 연산 (예: ADD, LOAD)
  2. 오퍼랜드(Operand): 연산에 필요한 데이터 또는 데이터의 위치(주소)
  3. 다음 명령어 주소: (분기/호출 시에만 사용)

2) 명령어는 어떻게 구성될까?

  • 명령어는 비트들로 이루어져 있으며, 연산 코드 필드, 오퍼랜드 필드 등으로 나뉨
  • 명령어 형식이란, 이 필드들의 개수, 배치, 비트 수를 정의한 것!
  • 보통 명령어의 길이는 CPU의 Word 크기와 같거나, 그 배수임.

  • 연산 코드의 비트 수는 CPU가 수행할 수 있는 연산들의 수를 결정해줌.
  • 위 예시에서는 연산 코드 필드의 길이가 4비트이므로, 16가지의 연산을 수행할 수 있음.
  • 오퍼랜드 필드는 오퍼랜드 명령어 필드의 종류에 따라 필요한 비트 수가 달라질 수 있으며, 배정되는 비트들의 수에 따라 각각의 범위가 결정됨.

3) 명령어 필드의 종류에 따른 비트 수 결정

필드 유형 설명
데이터 표현 가능한 값의 크기 결정
기억장치 주소 접근 가능한 메모리 공간 결정
레지스터 번호 사용할 수 있는 레지스터 수 결정
  • 명령어의 비트들을 연산의 종류와 수에 따라 필요한 만큼 연산 코드 필드에 배정
  • 나머지 비트들은 오퍼랜드들을 위해 적절히 배정함.

4) 오퍼랜드 수에 따른 명령어 형식 분류

형식 예시  의미
1-주소 ADD X AC ← AC + M[X]
2-주소 ADD R1, R2 R1 ← R1 + R2
레지스터 + 메모리 ADD R1, X R1 ← R1 + M[X]
3-주소 ADD R1, R2, R3 R1 ← R2 + R3
  • 1-주소 명령어:
  • ADD X ; AC <- AC + M[X] , (X는 데이터가 저장되어 있는 기억장치 주소를 나타냄.)
    - 기억장치 X번지의 내용과 AC의 내용을 더하고, 그 결과를 다시 AC에 저장

  • 2-주소 명령어
  • ADD R1, R2 ; R1 <- R1 + R2
    - 레지스터 R1, 레지스터 R2에 적재되어 있는 데이터를 더하고, 결과값을 레지스터 R1에 저장
  • 레지스터 + 메모리 명령어
  • ADD R1, X ; R1 <- R1 + M[X]
  • 그런데 위와 같은 명령어의 경우 명령어 코드 내에 레지스터 번호(R1)와 기억장치 주소(X)가 모두 포함되어야 하므로, 주소지정 할 수 있는 기억장치 영역이 상당히 제한됨

  • 3-주소 명령어
  • ADD R1, R2, R3 ; R1 <- R2 + R3
  • 이 명령어는 세 개의 오퍼랜드들을 포함하지만, 각각은 레지스터이기 때문에 비트 수가 많이 소요되지는 않음.

이와 같이 명령어의 오퍼랜드의 수에 따라 여러가지 명령어 형식이 존재하는데, 이는 프로그램의 길이에 직접적인 영향을 미침.


5) 실전 예시: X = (A + B) * (C - D) 구현

  • 사용할 니모닉스:
    • ADD
    • SUB
    • MUL
    • DIV
    • MOV
    • LOAD
    • STOR

1) 1-주소 명령어 형식

니모닉스 동작 설명
LOAD A AC ← M[A]
ADD B AC ← AC + M[B]
STOR T M[T] ← AC
LOAD C AC ← M[C]
SUB D AC ← AC - M[D]
MUL T AC ← AC * M[T]
STOR X M[X] ← AC


2) 2-주소 명령어 형식

니모닉스 동작 설명
MOV R1, A R1 ← M[A]
ADD R1, B R1 ← R1 + M[B]
MOV R2, C R2 ← M[C]
SUB R2, D R2 ← R2 - M[D]
MUL R1, R2 R1 ← R1 * R2
STOR X, R1 M[X] ← R1

 

3) 3-주소 명령어 형식

니모닉스 동작 설명
ADD R1, A, B R1 ← M[A] + M[B]
SUB R2, C, D R2 ← M[C] - M[D]
MUL X, R1, R2 M[X] ← R1 * R2
  • 레지스터의 수와 기억장치 용량이 고정된 상태에서 이 명령어 형식을 사용하면 명령어의 비트 수가 늘어나됨
  • 결과적으로 프로그램 길이는 줄어들지만 프로그램을 저장하기 위한 기억장치 용량은 별로 줄어들지 않으며, 명령어 해독 과정이 더 복잡하게 됨.

2. 주소지정 방식 (Addressing Mode)

주소지정 방식이란?

  • 명령어에 있는 오퍼랜드를 통해 **데이터의 실제 위치(EA, Effective Address)**를 결정하는 방식
  • 다양한 방식이 존재하며, CPU 구조나 성능에 큰 영향을 미침.

1) 직접 주소지정 방식 (Direct Addressing)

🔸 EA 계산

EA = A(A: 명령어 안에 포함된 주소)

🔸 설명

  • 명령어 내 오퍼랜드가 직접 메모리 주소를 지정
  • 해당 주소에서 데이터를 읽거나 씀

🔸 예시

LOAD A   ; AC ← M[A]

 

🔸 장점

  • 단순하고 빠름 (한 번의 메모리 접근으로 완료)

🔸 단점

  • 주소 공간이 제한됨 (오퍼랜드 비트 수에 의해)

2. 간접 주소지정 방식 (Indirect Addressing)

🔸 EA 계산

 

EA = (A)
(A가 가리키는 메모리의 내용이 유효 주소)

 

🔸 설명

  • 오퍼랜드는 메모리 주소를 가리키고
  • 그 주소에 또 다른 주소가 저장되어 있음 → 거기서 데이터 읽음

🔸 예시

LOAD (A)  ; AC ← M[M[A]]
 

🔸 장점

  • 매우 넓은 주소 공간 사용 가능 (메모리의 전체 주소 범위 활용)

🔸 단점

  • 메모리 접근이 2번 필요 → 느림

3. 즉시 주소지정 방식 (Immediate Addressing)

🔸 EA 없음 (데이터 직접 사용)

🔸 설명

  • 명령어 내 오퍼랜드가 데이터 자체를 포함
  • 데이터 인출 과정이 불필요

🔸 예시

MOV A, #5  ; A ← 5

 

🔸 장점

  • 매우 빠름 (메모리 접근 없음)
  • 명령어 실행 속도 향상

🔸 단점

  • 표현 가능한 값이 제한됨 (오퍼랜드 비트 수에 따라)

4. 묵시적 주소지정 방식 (Implicit Addressing)

 

🔸 EA 없음 (레지스터 등 내부 자원 자동 사용)

 

🔸 설명

  • 오퍼랜드가 명령어에 표시되지 않음
  • 특정 **레지스터(예: AC)**가 암묵적으로 사용됨

🔸 예시

CLR      ; AC ← 0 (누산기 초기화)
PUSH     ; 스택에 AC 저장

 

🔸 장점

  • 명령어 길이 짧고 단순함

🔸 단점

  • 유연성 부족 (사용할 데이터 위치를 선택할 수 없음)

5. 레지스터 주소지정 방식 (Register Addressing)

🔸 EA = R

(R: 명령어에 포함된 레지스터 번호)

 

🔸 설명

  • 데이터가 레지스터 안에 존재
  • 메모리에 접근하지 않고 연산 수행

🔸 예시

ADD R1, R2   ; R1 ← R1 + R2

 

🔸 장점

  • 매우 빠름 (레지스터는 접근 속도 빠름)
  • 명령어 짧음 (레지스터 번호는 비트 수 적음)

🔸 단점

  • 저장할 수 있는 데이터 수가 제한됨 (레지스터 수가 적음)

6. 레지스터 간접 주소지정 방식 (Register Indirect Addressing)

🔸 EA = (R)

(R: 주소를 저장한 레지스터)

🔸 설명

  • 레지스터가 가리키는 메모리 주소에서 데이터를 읽음
  • 즉, 레지스터는 간접 주소의 포인터 역할

🔸 예시

LOAD (R1)  ; AC ← M[R1]

 

🔸 장점

  • 레지스터의 속도와 메모리의 유연함을 동시에 활용 가능

🔸 단점

  • EA 계산을 위해 레지스터 내용을 읽는 연산 필요

7. 변위 주소지정 방식 (Displacement Addressing)

🔸 EA = A + (R)

🔸 설명

  • 오퍼랜드(A)와 **레지스터(R)**의 값을 더해서 주소를 계산
  •  EA는 R이 가리키는 레지스터의 내용을 A와 더함으로써 결정
  • 레지스터가 베이스, 오퍼랜드가 오프셋 역할

🔸 예시

LOAD A(R1)  ; AC ← M[A + R1]

 

변위 주소지정 방식의 세부 형태

방식 EA 계산  특징
상대 주소지정 (PC-relative) EA = A + (PC) 분기 명령어에서 사용, 프로그램 흐름 제어
인덱스 주소지정 (Indexed) EA = A + (IX) 배열 접근, 루프 처리에 효과적
베이스 레지스터 (Base Register) EA = A + (BR) 프로그램 로딩 주소 기준, 메모리 위치 독립성

 

 

  • 상대 주소지정 ( EA = A + (PC) )
    - PC(Program Counter)가 묵시적으로 사용됨
    - 주로 분기(branch) 명령어에서 사용
    - 오퍼랜드(A)가 양수면 앞으로, 음수면 뒤로 분기
  • 인덱스 주소지정( EA = A + (IX) )
    - A: 배열의 시작 주소
    - IX: 현재 접근하려는 데이터까지의 거리
    - 루프에서 반복 접근 시 유리
    - **자동 인덱싱(auto-indexing)**도 가능: IX ← IX + 1 자동 수행
  • 베이스 레지스터( EA = A + (BR) )

        - BR에는 프로그램이 시작되는 기준 주소 저장
        - A는 그 기준에서의 상대적 오프셋