Computer Science 기본 지식/컴퓨터 구조

[컴퓨터 구조] 4. 명령어 실행

로파이 2021. 4. 18. 01:18

관련 포스트

2021.01.12 - [Operating System] - [운영체제] 명령어 구조와 사이클 / 인터럽트 / 커널

 

[운영체제] 명령어 구조와 사이클 / 인터럽트 / 커널

독학사- 운영체제 편을 공부하고 정리한 내용입니다. 명령어 구조 프로세서는 명령어에 따라 레지스터 값(피연산자)을 이용하여 연산을 실행한다. 연산 부호(명령부)와 피연산자들(주소부로)로

narakit.tistory.com

 

일반적인 명령어 사이클

1. 명령어 인출 Instruction Fetch

주기억장치의 지정된 주소에 저장된 명령어를 명령 레지스터 IR(Instruction Register)로 가져온다.

 

2. 명령어 해독 Instruction Decode

명령어를 해독하여 실행할 연산 opcode를 알아낸다.

 

3. 데이터 인출 Operand Fetch

명령어 실행을 위해 피연산자 레지스터에 데이터를 가져와야하는 경우 주기억장치/입출력장치로부터 데이터를 인출한다.

 

4. 데이터 처리 Execution

ALU에서 피연산자에 대한 산술 및 논리적 연산을 수행한다.

 

5. 데이터 저장 Write

수행 결과를 주 메모리에 다시 쓰거나 임시 결과를 레지스터에 저장한다.

 

명령어 실행 루틴

 

- 관련 CPU 내부 레지스터

IR: Instruction Register 명령 레지스터

MAR: Memory Address Register 주 기억장치 레지스터 혹은 주소 레지스터

MBR: Memory Buffer Register 혹은 Memory Data Register 임시 데이터가 저장되는 레지스터

PC: Program Counter 다음 실행할 명령어의 주소(기계어 코드의 위치)를 저장한다.

SP: Stack Pointer 저장할 피연산자 정보가 쌓일 때 스택의 맨 위 주소를 가리키는 레지스터

AC: Accumulator 임시 연산 결과나 피연산자자가 저장되는 레지스터 

GPR: Gerneral Purpose Register 위 특수 레지스터를 제외한 일반적인 데이터 저장용으로 사용되는 범용 레지스터

 

명령어 인출->실행->인출->실행의 반복으로 구성된다.

 

인출 사이클

1) 프로그램 카운터에 저장된 명령어 주소를 CPU 내부 버스를 통해 MAR에 내보낸다.

2) MAR에 저장된 주소에 해당하는 명령어 데이터를 주 메모리로부터 참조하여 데이터 버스를 통해 MBR에 가져온다.

   PC값이 1 워드 증가한다.

3) MDR에 있는 명령어가 IR로 전송된다.

 

- 마이크로 연산 표현

1) MAR <- PC

2) MDR <- Mem[MAR], PC <- PC + 1

3) IR <- MDR

 

--- 실행 사이클

IR에 보내진 명령어 코드를 제어 유닛에서 해독한 후 그 결과에 따라 필요한 연산들을 수행한다. 이 과정에서 수행되는 연산은 해독된 명령어의 opcode에 따라 수행된다.

  • 데이터 전송: 레지스터<->레지스터, 레지스터<->기억장치, 기억장치<->기억장치간에 데이터를 이동시키는 명령 
  • 산술 연산: 2의 보수 및 부동소수점에 관한 덧셈, 뺄셈, 곱셈, 나눗셈과 같은 기본적인 산술 연산 명령
  • 논리 연산: 데이터의 각 비트에 대한 AND,OR,NOT 및 Exculsive OR과 같은 논리연산 명령
  • 입출력: CPU와 I/O장치 간의 데이터를 이동시키는 명령
  • 프로그램제어: 다음 명령어 실행을 바꾸는 분기 / 서브루틴 호출 / 리턴 명령

명령어 필드

1워드 크기의 비트로 이루어진 기계어

연산 코드 opcode와 피연산자로 이루어져 있으며 피연산자는 immediate 데이터 혹은 어떤 데이터의 주소값을 저장한다.

 

명령어 실행 사이클

LOAD 명령어 ex) RISC-V: ld x4 x5 : x5 메모리 주소에 있는 데이터를 x4에 적재하는 명령

1) IR -> MAR : CPU 내부 버스로 x5 주소를 전달

2) Mem[MAR] -> MDR : 데이터 버스로 MDR로 해당 메모리 주소에 있는 데이터 전달

3) MDR -> x4 : 레지스터 x4에 적재

 

STORE 명령어 ex) RISC-V: sd x4 x5 : x4 레지스터 값을 x5의 메모리 주소에 저장하는 명령

1) IR -> MAR : CPU 내부 버스로 x5 주소를 전달

2) x4 -> MDR : 저장할 레지스터 값을 MDR에 전달

3) MDR -> Mem[MAR] : MDR에 저장된 값을 메모리에 쓴다.

 

간접 사이클

해당 주소가 다른 데이터를 가리키는 주소일 때 실제 데이터의 유효 주소를 가져오는 사이클이 추가될 수 있다.

1) IR -> MAR: 해당 주소를 MAR에 내보낸다.

2) Mem[MAR] -> MDR: 해당 주소에 있는 데이터(유효 주소)를 데이터 버스를 통해 MDR에 저장한다.

3) MDR -> IR: 유효 주소 정보를 IR에 저장한다.

 

인터럽트 루틴

운영체제에 의해 CPU가 실행하던 프로그램을 멈추고 요청된 다른 프로그램을 실행하는 것을 의미한다.

 

처리 과정

실행 중인 명령어를 끝낸 뒤, 다음 실행할 명령어 주소(PC)값을 스택에 저장한다.

인터럽트 루틴의 시작 명령어 주소를 PC값에 할당한다.

해당 인터럽트 루틴으로 분기한다.

 

1) PC -> MDR : 스택에 저장할 기존 PC 값을 저장한다.

2) SP -> MAR, ISR -> PC :  인터럽트 서비스 루틴을 PC에 가져온다.

3) SP - 1 -> SP, MDR -> Mem[MAR] : 저장된 PC 값을 스택에 저장하고 스택 포인터를 1 워드만큼 감소시킨다.

 

서브 루틴

다른 함수의 호출로 실행되는 루틴이다. 마찬가지로 기존 PC 값을 스택에 저장하고 분기할 명령어 주소가 PC값에 저장된다.

return으로 서브 루틴에서 복귀하면 스택에 저장된 PC 값을 복원하고 기존 함수의 실행되던 명령어를 실행한다.

 

참고 : Computer Organization and Design RISC-V edition