---
description: 명령 사이클(instruction cycle) (CPU 동작 방식)
---

# Instruction cycle (CPU operation method)

* CPU가 하나의 명령어를 수행하는 데 필요한 모든 단계나 과정
* 계속해서 명령 사이클을 반복하면서 CPU가 동작함
* 여러 단계로 나뉘어져 있음

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FUlIdt5PAPFbJ9XW0ZTuT%2Fimage.png?alt=media&#x26;token=dbe7b0bc-7a6d-4190-af94-1dd4cc899e22" alt=""><figcaption></figcaption></figure>

1. **인출(Fetch)**
   * 주기억장치로부터 수행할 명령어를 CPU로 가져옴
     * CPU의 프로그램 카운터(Program Counter, PC)가 가리키는 메모리 주소에서 명령어를 가져와 명령어 레지스터(Instruction Register, IR)에 저장
   * 프로그램 카운터는 다음 명령어의 주소를 가리키도록 증가
2. **간접(Indirect)**
   * IR의 명령이 메모리 접근을 필요로 한다면, 해당 명령이의 메모리 주소가 **`직접` 주소**인지 **`간접 주소`**&#xC778;지 확인
     * if **`직접 주소 명령`**
       * 추가적인 작업 없이 다음 단계로 진행
     * if **`간접 주소 명령`**
       * IR에 저장된 오퍼랜드를 통해 실제 메모리 주소를 찾아 해당 위치의 데이터를 가져온다.
       * 가져온 데이터(실제 메모리 주소)를 IR의 오퍼랜드 부분에 저장한다.
3. **실행(Execute)**
   * 인출된 명령어를 해독(decode)하고 적절한 동작을 수행
   * 실행 사이클에서 수행되는 마이크로 연산들은 명령어에 따라 다름
     * `ADD`, `LOAD`, `STA`, `JUMP` …
4.  **인터럽트(Interrupt)**

    * 인터럽트 발생시 인터럽트 처리를 위한 단계
    * 인터럽트 처리 순서

    <figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FEbweWdhENOkgwm4B6LJ7%2Fimage.png?alt=media&#x26;token=6d712a47-c3a3-448d-ba4a-d9fa84ef5565" alt=""><figcaption></figcaption></figure>

<details>

<summary><code>직접 주소</code> vs <code>간접 주소</code></summary>

\*\*주소 지정 방식(Addressing Modes)\*\*에 대한 내용이다.

#### **직접 주소 지정 방식 (Direct Access Mode)**

* **개념**: 직접 메모리 접근 방식에서는 어셈블리 명령어 내의 오퍼랜드가 실제로 접근하고자 하는 메모리의 주소를 직접 나타냅니다.
* **예시**: \*\*`LOAD R1, 1000`\*\*이라는 명령어가 있다면, 이는 메모리 주소 \*\*`1000`\*\*에서 값을 가져와서 레지스터 \*\*`R1`\*\*에 저장하라는 의미입니다.

#### **간접 주소 지정 방식 (Indirect Access Mode)**

* **개념**: 간접 메모리 접근 방식에서는 어셈블리 명령어 내의 오퍼랜드가 실제 데이터의 메모리 주소를 담고 있는 다른 메모리 위치를 가리킵니다. 즉, 명령어의 오퍼랜드는 "주소의 주소"를 나타내게 됩니다.
* **예시**: \*\*`LOAD R1, (1000)`\*\*이라는 명령어가 있다면, 이는 메모리 주소 \*\*`1000`\*\*에 저장된 값을 먼저 가져와서 (이 값은 또 다른 메모리 주소일 것입니다), 그 주소 위치에서 실제 데이터를 가져와 레지스터 \*\*`R1`\*\*에 저장하라는 의미입니다.

간단히 요약하면:

* **직접 주소 지정 방식**: "이 주소에 있는 데이터를 가져와라."
* **간접 주소 지정 방식**: "이 주소에 있는 값을 가져와, 그 값이 가리키는 주소로 가서 데이터를 가져와라."

간접 접근 방식은 특정 목적에 맞게 메모리 구조를 동적으로 변경할 필요가 있을 때 유용합니다. 예를 들어, 포인터나 참조 변수, 테이블 기반의 접근 방식 등에서 간접 메모리 접근 방식을 활용하게 됩니다.

</details>



![스크린샷 2023-09-20 오후 5.23.40.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/cc7e2c56-c0b4-4ec2-b96f-8b74abd33a8b/0087f83c-9051-4323-a0c9-808f7d9992f3/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2023-09-20_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_5.23.40.png)

***

참조

[명령 주기](https://ko.wikipedia.org/wiki/%EB%AA%85%EB%A0%B9_%EC%A3%BC%EA%B8%B0)

[https://velog.io/@onenewarm/%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%82%AC%EC%9D%B4%ED%81%B4](https://velog.io/@onenewarm/%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%82%AC%EC%9D%B4%ED%81%B4)

[\[컴퓨터 공학 기초 강의\] 11강. 명령어 사이클과 인터럽트](https://youtu.be/3Yz7OnVUM28?si=31EIJvkmYVr_pkbJ)
