컴퓨터 구조

명령어 (Instruction)

chan4 2023. 4. 23. 23:31

해당 블로그의 내용은 학교에서 배운 내용을 개인적으로 정리한 내용이므로, 잘못된 부분이 있을 수도 있습니다. 

 

명령어 세트 (Instruction set)

  • 어떤 CPU를 위하여 정의되어 있는 명령어들의 집합
  • 명령어 세트 설계를 위해 결정되어야 할 사항들
    • 연산 종류(operation repertoire): CPU가 수행할 연산들의 수와 종류 및 복잡도
    • 데이터 형태(data type): 연산을 수행할 데이터들의 형태, 데이터의 길이(bit), 수의 표현 방식 등
    • 명령어 형식(instruction format): 명령어의 길이, 오퍼랜드 필드 수와 길이 등
    • 주소지정 방식(addressing mode): 오퍼랜드의 주소를 지정하는 방

연산의 종류

  • 데이터 전송
    • 레지스터-레지스터 / 레지스터-기억장치 / 기억장치-기억장치 간의 데이터를 이동하는 동작
  • 산술 연산
    • 덧셈, 뺄셈, 곱셈 및 나눗셈과 같은 기본적인 산술 연산
  • 논리 연산
    • 데이터의 각 비트들 간에 대한 AND, OR, NOT 및 exclustive-OR 연산
  • 입출력(I/O)
    • CPU와 외부 장치들 간의 데이터 이동을 위한 동작들 
  • 프로그램 제어
    • 명령어 실행 순서를 변경하는 연산들
    • 분기(branch), 서브루틴 호출(subroutine call) 

서브루틴 호출을 위한 명령어들

  • CALL 명령어
    • 현재의 PC 내용을 스택(stack)에 저장하고, 서브루틴의 시작 주소로 분기하는 명령어
  • RET 명령어
    • CPU가 원래 실행하던 프로그램으로 복귀(return) 시키는 명령어

CALL (X) 명령어

MBR <- PC; // 1 clock

MAR <- SP; // 2 clock
PC <- X;

M[MAR] <- MBR; // 3 clock
SP <- SP - 1;
  • 만약 주소지정 단위가 바이트(byte)이고, 저장될 주소가 16비트(=2byte)라면, SP  = SP - 2 로 변경

RET 명령어

SP <- SP + 1; // 1 clock

MAR <- SP; // 2 clock

PC <- M[MAR]; // 3 clock

 

명령어 형식

  • 연산 코드(Operation code)
    • 연간의 개수를 결정
  • 오퍼랜드(Operand)
    • 오퍼랜드의 종류에 따라 범위가 달라짐
      • 데이터(data): 표현 가능한 수의 범위 결정
      • 기억장치 주소(address): CPU가 오퍼랜드 인출을 위하여 직접 주소를 지정할 수 있는 기억장치 용량 결정
      • 레지스터 번호(index): 데이터 저장에 사용될 수 있는 레지스터의 개수 결정 
  • 다음 명령어 주소(Next instruction Address)
  • 명령어 형식(instruction format)
    • 명령어 내 필드들의 수와 배치 방식 및 각 필드의 비트 수
  • 필드(field)
    • 명령어의 각 구성 요소들에 소요되는 비트들의 그룹
  • 명령어의 길이
    • 단어(word) 길이

오퍼랜드 수에 따른 명령어 분류

  • 1-주소 명령어(one-address instruction)
    • ADD X
  • 2-주소 명령어(two-address instruction)
    • ADD R1, R2
    • MOV R1, R2
    • ADD R1, X
  • 3-주소 명령어(three-address instruction)
    • ADD R1, R2, R3

주소지정 방식 (Addressing mode)

  • 명령어 실행에 필요한 오퍼랜드(데이터) 주소를 결정하는 방식
  • 다양한 주소지정 방식을 사용하는 이유
    • 제한된 수의 명령어 비트들을 이용하여, 프로그래머가 여러 가지 방법으로 오퍼랜드의 주소를 결정하도록 해줌
    • 더 큰 용량의 기억 장치를 사용할 수 있게 하기 위해
  • 기호
    • EA(Effective Address): 데이터가 저장된 기억장치의 실제 주소
    • A: 명령어 내의 주소 필드 내용 (오퍼랜드 필드의 내용이 기억장치 주소일 경우)
    • R: 명령어 내의 레지스터 번호 (오퍼랜드 필드의 내용이 레지스터 번호인 경우)
    • (A): 기억장치 A 번지의 내용
    • (R): 레지스터 R의 내용

직접 주소지정 방식 (Direct)

  • 오퍼랜드 필드의 내용이 유효 주소(EA)가 되는 방식
    • $ EA = A $
  • 장점
    • 한 번의 기억장치 접근으로 데이터 인출 가능
  • 단점
    • 남은 비트들만 주소 비트로 사용될 수 있기 때문에 직접 지정할 수 있는 기억장소의 수가 제한 

간접 주소지정 방식 (Indirect)

  • 오퍼랜드 필드에 기억장치 주소가 저장되어 있음
    • 해당 주소가 가리키는 기억 장소에 데이터의 유효 주소를 저장해두는 방식
  • $ EA = (A) $
  • 명령어 형식에 간접비트($I$) 필요
    • $I = 0$ , 직접 주소지정 방식
    • $I = 1$, 간접 주소지정 방식
  • 다단계 간접 주소지정 방식
  • ex. $ EA =(((A))) $
  • 장점
    • 최대 기억장치 용량단어의 길이에 의하여 결정
      • 주소지정 가능한 기억장치 용량 확장
      • 단어 길이가 $n$ 비트라면, 최대 $2^{n}$ 개의 기억 장소 주소지정이 가능
  • 단점
    • 실행 사이클 동안에 두 번의 기억장치 엑세스가 필요

묵시적 주소지정 방식 (Implied)

  • 명령어 실행에 필요한 데이터의 위치가 묵시적으로 지정되는 방식
  • EX)
    • SHL 명령어: 누산기의 내용을 좌측으로 쉬프트(shift)
    • PUSH R1 명령어: 레지스터 R1의 내용을 스택에 저장 
  • 장점
    • 명령어 길이가 짧다
  • 단점
    • 종류가 제한된다.

즉시 주소지정 방식 (Immediate)

  • 데이터가 명령어에 포함되어 있는 방식 
    • 오퍼랜드 필드의 내용이 연산에 사용할 실제 데이터
  • 프로그램에서 레지스터나 변수의 초기 값을 어떤 상수값(constant value)으로 설정하는데 사용
  • 장점
    • 데이터를 인출하기 위해 기억장치에 접근할 필요가 없음
  • 단점
    • 상수값의 크기가 오퍼랜드 필드의 비트 수에 의해 제한됨

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

  • 연산에 사용될 데이터가 내부 레지스터에 저장되어 있을 경우, 명령어의 오퍼랜드가 해당 레지스터를 가리키는 방식
  • $EA = R $
  • 주소지정에 사용될 수 있는 레지스터들의 수 = $2^{k}$
    • k = 오퍼랜드 필드의 비트 수
  • 장점
    • 오퍼랜드 필드의 비트 수가 적어도 된다
    • 데이터 인출을 위한 기억장치 접근이 필요 없다
  • 단점
    • 데이터가 저장될 수 있는 공간이 CPU 내부 레지스터들로 제한

레지스터 간접 주소지정 방식 (Register-indirect)

  • 오퍼랜드 필드(레지스터 번호)가 가리키는 레지스터의 내용을 유효 주소로 사용하여 실제 데이터를 인출하는 방식
  • $ EA = (R) $

 

변위 주소지정 방식 (Displacement)

  • 직접 주소지정과 레지스터 간접 주소지정 방식의 조합
  • $ EA = A + (R) $

 

상대 주소지정 방식 (Relative addressing mode)

  •  프로그램 카운터(PC)를 레지스터로 사용
  • 주로 분기 명령어에서 사용
  • $ EA = A + (PC) $
    • 단, A 는 2의 보수
    • A > 0 : 앞 방향으로 분기
    • A < 0 : 뒷 방향으로 분기
  • 장점
    • 전체 기억장치 주소가 명령어에 포함되어야 하는 일반적인 분기 명령어보다 적은 수의 비트만 있으면 됨
  • 단점
    • 분기 범위가 오퍼랜드 필드의 길이에 의해 제한된다. 

 

인덱스 주소지정 방식 (Indexed addressing mode)

  • 인덱스 레지스터의 오퍼랜드와 변위 A를 더하여 유효 주소를 결정
  • $EA = (IX) + A $
    • 인덱스 레지스터(IX): 인덱스(index) 값을 저장한는 특수 레지스터
  • 주요 용도는 배열 데이터 접근
  • 자동 인덱싱(auto-indexing)
    • 명령어가 실행될 때마다 인덱스 레지스터의 내용이 자동적으로 증가/감소한다
    • 아래의 두 연산이 연속적으로 수행됨
      • $ EA = (IX) + A $
      • $ IX = IX + 1 $

 

베이스-레지스터 주소지정 방식 (Base-register addressing mode)

  • 베이스 레지스터의 내용과 변위 A를 더하여 유효 주소 결정
  • $ EA = (BR) + A $
  • 주요 용도는 프로그램의 위치(변경) 지정에 사용
    • 다중프로그래밍 환경에서 프로그램 코드 및 데이터를 다른 위치로 이동시켜야 할 때,
      다른 주소 필드 내용을 바꿀 필요 없이 BR의 내용만 변경하면 된다

 

실제 상용 프로세서들의 명령어 형식

  • PDP-10 프로세서
    • 고정 길이의 명령어 형식 사용 
    • word = 36bit
    • 명령어 길이 = 36bit
    • 연산 코드 길이 = 9bit
  • PDP-11 프로세서
    • 다양한 길이의 명령어 형식들 사용
    • 연산 코드 = 4~16bit
    • 주소 개수 = 0, 1, 2 개