동작 | 기능 |
---|---|
명령어인출 (Instruction Fetch) | 기억장치 ➡️ 명령어 읽어옴 |
명령어해독 (Instruction Decode) | 수행해야 할 동작 결정을 위해 ➡️ 명령어 해독 |
모든 명령어들에 대해 공통적 수행
동작 | 기능 |
---|---|
데이터인출 (Data Fetch) | 명령어 실행을 위해 데이터 필요 ➡️ 기억장치 or I/O장치 데이터 읽어옴 |
데이터처리 (Data Process) | 데이터 산술적 or 논리적 연산 수행 |
데이터저장 (Data Store) | 수행한 결과 ➡️ 저장 |
명령어에 따라 필요한 경우에만 수행
👾 산술논리연산장치(ALU)
: 각종 산술연산 및 논리연산 수행
👾 레지스터(register)
: 엑세스속도가 가장 빠른 기억장치
👾 제어유니트
: 프로그램코드 (명령어) 해석 → 실행하기 위한 제어신호들을 순차적으로 발생
👾 CPU 내부버스
: ALU ↔︎ 레지스터의 데이터이동을 위한 데이터선 + 제어신호선
👾 명령어사이클(instruction cycle)
- CPU가 한개의 명령어를 실행하는데 필요한 전체처리과정
- 프로그램 실행 시작 → 전원 OFF or 회복불가 Error로 인한 중단전까지 계속 반복됨
두 개의 부사이클(subcycle)로 분리
📍 인출사이클 (fetch cycle)
- CPU → 기억장치로부터 명령어를 읽어오는 단계
📍 실행사이클 (execution cycle)
- 명령어를 실행하는 단계
기본 명령어사이클
명령어실행에 필요한 CPU 내부레지스터
📍 프로그램카운터 (Program Counter : PC)
- 다음에 인출(Fetch)할 명령어의 주소를 가지고있는 레지스터
- 명령어 인출 후 → 자동적으로 일정크기만큼 증가 (한 명령어길이)
- 분기명령어(branch) 실행 → 목적지 주소로 갱신
📍 누산기 (Accumulator : AC)
- 데이터를 일시적으로 저장하는 레지스터
- 레지스터길이 = CPU가 한번에 처리할 수 있는 데이터 bit수 (단어길이 32bit, 64bit)
📍 명령어레지스터 (Instruction Register : IR)
- 가장 최근에 인출된 명령어코드가 저장되어있는 레지스터
📍 기억장치주소레지스터 (Memory Address Register : MAR)
- PC에 저장된 명령어주소 → 시스템 주소버스로 출력되기 전,
일시적으로 저장되는 주소레지스터
📍 기억장치버퍼레지스터 (Memory Buffer Register : MBR)
- 기억장치에 쓰여질 데이터 + 기억장치로부터 읽혀진 데이터
- 일시적으로 저장하는 버퍼레지스터
데이터통로가 표시된 CPU 내부구조
인출사이클 마이크로연산(micro-operation)
📍 t₀ : MAR ← PC
📍 t₁ : MBR ← M[MAR], PC ← PC + 1
📍 t₂ : IR ← MBR
(t₀, t₁, t₂ → CPU 클럭주기)
현재 PC 내용 → CPU 내부버스 → MAR로 전송
기억장치 위치로부터 읽혀진 명령어 → 데이터버스 → MBR로 적재
PC내용 + 1
MBR에 명령어코드 → IR로 이동
📍 CPU 클럭주파수 = 1GHz (클럭주기 = 1ns)
➡️ 인출사이클 : 1ns × 3 = 3ns 소요
인출사이클 주소 및 명령어흐름도
👾 실행사이클
: 명령어코드 해독 (Decode) → 그 결과에 따라 필요한 연산들 수행
CPU가 수행하는 연산종류
실행사이클 마이크로연산(micro-operation) : 명령어의 연산코드(op code)에 의해 결정됨
📍 연산코드 (operation code)
- CPU가 수행할 연산을 지정
📍 오퍼랜드 (operand)
- 명령어 실행에 필요한 데이터가 저장된 주소 (addr)
📎 LOAD addr 명령어
📍 LOAD addr
- 기억장치에 저장되어있는 데이터 → CPU 내부 레지스터 AC로 이동하는 명령어
- AC : 누산기 (데이터 일시적 저장)
t₀ : MAR ← IR(addr)
t₁ : MBR ← M[MAR]
t₂ : AC ← MBR
주기 | 과정 |
---|---|
첫번째주기 | (명령어레지스터)IR → 명령어 주소 → (기억장치주소레지스터)MAR |
두번째주기 | 기억장소 → 데이터인출 → (기억장치버퍼레지스터)MBR |
세번째주기 | (기억장치버퍼레지스터)MBR 데이터 → (누산기)AC 적재 |
📎 STA addr 명령어
📍 STA addr 명령어
- AC 레지스터 내용 → 기억장치에 저장하는 명령어
t₀ : MAR ← IR(addr)
t₁ : MBR ← AC
t₂ : M[MAR] ← MBR
주기 | 과정 |
---|---|
첫번째주기 | (명령어레지스터)IR → 데이터 저장할 기억장치 주소 → (기억장치주소레지스터)MAR |
두번째주기 | (누산기)AC → 저장할 데이터 → (기억장치버퍼레지스터)MBR |
세번째주기 | (기억장치버퍼레지스터)MBR → 저장할 데이터 → (기억장치주소레지스터)MAR 지정 기억장소에 저장 |
📎 ADD addr 명령어
📍 ADD addr 명령어
- 기억장치에 저장된 데이터 → AC 내용과 더함
- 더한 결과 → 다시 AC에 저장하는 명령어
t₀ : MAR ← IR(addr)
t₁ : MBR ← M[MAR]
t₂ : AC ← AC + MBR
주기 | 과정 |
---|---|
첫번째주기 | (명령어레지스터)IR → 데이터 불러올 기억장치 주소 → (기억장치주소레지스터)MAR |
두번째주기 | 불러온 데이터 → (기억장치버퍼레지스터)MBR |
세번째주기 | 불러온 데이터 + 기존 (누산기)AC 데이터 → 결과값 (누산기)AC 재저장 |
📎 JUMP addr 명령어
📍 JUMP addr 명령어
- 오퍼랜드(addr)가 가리키는 위치의 명령어
- 실행순서를 변경하는 분기(branch) 명령어
t₀ : PC ← IR(addr)
주기 | 과정 |
---|---|
첫번째주기 | 명령어의 오퍼랜드(분기할 목적지 주소) → (프로그램카운터)PC에 저장 |
다음 명령어 인출사이클 → addr 주소의 명령어 인출 |
연산코드 임의 정수 배정
어셈블리언어 | 정수 |
---|---|
LOAD (기억장치 → AC) | 1 |
STA (AC → 기억장치) | 2 |
ADD (기억장치데이터 → AC + 불러온데이터 → AC 재저장) | 5 |
JUMP (addr 위치 명령어 실행) | 8 |
주소 | 명령어 | 기계코드 |
---|---|---|
100 | LOAD 250 | 1250 |
101 | ADD 251 | 5251 |
102 | STA 251 | 2251 |
103 | JUMP 170 | 8170 |
LOAD 250 실행
ADD 251 실행
STA 251 실행
JUMP 170 실행
👾 인터럽트사이클(interrupt cycle)
- ① 프로그램 실행 중, CPU 현재 처리 순서 중단 ⛔️
- ② 다른 동작을 먼저 수행하도록 요구하는 시스템동작
📍 인터럽트 서비스 루틴 (ISR)
- Interrupt 처리를 위해 수행되는 프로그램루틴
Interrupt에 의한 제어의 이동
Interrupt 처리과정
📍 CPU
- 어떤 장치가 interrupt 요청했는지 확인 → 해당 ISR 호출
- 서비스 종료 후 → 중단되었던 원래 프로그램 다시 수행
📍 CPU Interrupt 처리의 세부동작
① 현재 명령어 실행 끝낸 즉시 → 다음 실행 명령어 주소 (PC내용) 스택에 저장
- 스택 : 데이터를 순차적으로 쌓아 가장 나중에 쌓은 스택이 가장 먼저 쓰임
- (주기억장치의 특정부분)
② ISR 호출을 위해, 루틴 시작주소를 PC 적재
- 시작주소 : Interrupt 요구 장치로부터 전송 or 미리정해진값
Interrupt 사이클 마이크로연산
t₀ : MBR ← PC
t₁ : MAR ← SP, PC ← ISR 시작주소
t₂ : M[MAR] ← MBR
주기 | 과정 |
---|---|
첫번째주기 | (프로그램카운터)PC → 다음인출할 명령어주소 → (기억장치버퍼레지스터)MBR |
두번째주기 | ① (Interrupt stack top address)SP → (기억장치주소레지스터)MAR |
② (프로그램카운터)PC → 다음인출할 명령어주소 → ISR 시작주소로 변경 | |
세번째주기 | (기억장치버퍼레지스터)MBR → 원래 PC 내용 → 스택에 저장 |
Interrupt 사이클 마이크로연산 예시
📍 LOAD 250 명령어 실행 중, Interrupt 들어옴
📍 현재 SP = 999
📍 Interrupt ISR = 650 번지
100 LOAD 250
101 ADD 251
102 STA 251
103 JUMP 170
👾 다중인터럽트(multiple interrupt)
: 인터럽트 서비스 루틴 수행 중, 다른 인터럽트 발생
다중인터럽트 처리방법
① 새로운 인터럽트 사이클 수행 ⛔️
인터럽트플래그(interrupt flag) ← 0
: 인터럽트 불가능상(interrupt disabled)② 인터럽트 우선순위 설정
👾 간접사이클(Indirect cycle)
: 명령어에 포함되어있는 주소 → 해당 명령어 실행에 필요한 데이터의 주소를 인출하는 사이클
간접사이클 마이크로연산
t₀ : MAR ← IR(addr)
t₁ : MBR ← M[MAR]
t₂ : IR(addr) ← MBR
데이터과학을 공부 하면서 컴퓨터 하드웨어가 데이터를 어떻게 처리하는 지 궁금했었는데, 잘 요약해주셔서 유익 했슴다..!