//구글콘솔 광고 추가가

레지스터란?

CPU 내부의 작은 임시 저장 장치이며,

프로그램 속 명령어 & 데이터는 실행 전 후로 관련된 값들이 레지스터에 저장된다.

 

반드시 알아야 할 레지스터의 종류
1 프로그램 카운터 메모리에서 가져올 명령어의 주소를 저장 (메모리에서 읽어 들일 명령어의 주소)
>> Instruction Pointer(명령어 포인터) 라고도 부르는 cpu도 있음
2 명령어 레지스터 해석할 명령어를 저장 (방금 메모리에서 읽어 들인 명령어) >> 제어장치가 해석
3 메모리 주소 레지스터 메모리의 주소 저장 >> CPU가 읽어 들이고자 하는 주소를 주소버스로 보낼때 거치는 레지스터
4 메모리 버퍼 레지스터 메모리와 주고 받을 값을 저장(데이터와 명령어) >> CPU가 정보를 데이터 버스로 주고 받을떄 거치는 레지스터
5 플래그 레지스터 연산 결과 또는 CPU 상태에 부가적인 정보를 저장
6 범용 레지스터 다양하고 일반적인 상황에서 자유롭게 사용(주소, 명령어, 데이터 등 다양하게 저장 가능)
7 스택 포인터 주소 지정에 사용 스택 주소 지정 방식: 스택과 스택 포인터를 이용한 주소 지정 방식
스택 포인터: 스택의 꼭대기를 가리키는 레지스터. (스택이 어디까지 차 있는지에 대한 표시 같은거.)
8 베이스 레지스터 주소 지정에 사용 번위 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 특정 레지스터(프로그램 카운터, 베이스 레지스터)의 값을 더하여 유효 주소 얻기. 
상대 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 프로그램 카운터의 값을 더하여 우효 주소 얻기.
베이스 레지스터 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 베이스 레지스터(기준 주소)의 값을 더하여 유효 주소 얻기.

명령어 사이클과 인터럽트 ★ ★ ★

명령어 사이클

- 명령어 사이클이란, 프로그램 속 명령어들은 일정한 주기가 반복되며 실행되는데 이 주기를 말함.

인출 사이클 : 가장 먼저 CPU를 갖고 온다.
실행 사이클:  가지고 온 걸 실행한다.
인출 >> 실행 >> 인출 >> 실행... (반복). 
but, CPU로 명령어를 가지고 와도 바로 실행이 불가능한 경우도 있음.
이러한 메모리 접근이 더 필요한 경우엔 간접 사이클이 추가됨.
인출>> 간접 >> 실행 >> 인출 >>...(반복)

인터럽트가 발생했을 경우, 인터럽트 사이클 추가 됨.
인출 >> 간접 >> 실행 >> 인터럽트 >> 인출...(반복)
인터럽트
: 정해진 흐름대로 명령어를 처리하려는 CPU의 흐름을 끊어 버리는 행동을 함.

- 인터럽트(interrupt): 방해하다, 중단시키다.

- CPU가 꼭 주목해야 할 때이거나, CPU가 얼른 처리해야 할 다른 작업이 생겼을 때 발생.
ex>> 헤이헤이, 급해 급해!! 지금 하던 거 일단 멈추고 이것부터 실행해 줘!!
-인터럽트의 종류 :
1. 동기 인터럽트(예외) : CPU가 예기치 못한 상황을 접했을 때 발생.
 -동기 인터럽트의 종류 : 폴트, 트랩, 중단, 소프트웨어 인터럽트.
2. 비동기 인터럽트(하드웨어 인터럽트) : 주로 입출력장치에 의해 발생. 알림과 같은 역할(쿠쿠밥다됨 알림 같은 거)
하드웨어 인터럽트에 대해 더 자세하게 알아보자.
:  알림과 같은 인터럽트.

- 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 하드웨어 인터럽트 사용.

- 입출력장치는 CPU에 비해 느리다.
  인터럽트가 없다면 CPU는 명령 완료 여부를 확인하기 위해 주기적으로 확인해야 됨.
>> 그렇기 때문에 인터럽트를 이용해 입출력 작업동안 CPU가 다른 일을 할 수 있게 함.
하드웨어 인터럽트의 처리 순서
:인터럽트의 종류와 상관없이 인터럽트 처리 순서는 비슷함.
  1. 입출력 장치는 CPU에 인터럽트 요청 신호를 보냄.(입출력 장치들이 "지금 껴들어가도 되나요?" 하는 요청신호)
  2. CPU는 실행 사이클이 끝나고 명령어를 인출하기 전에 항상 인터럽트 여부를 확인함.
  3. CPU는 인터럽트 요청을 확인하고 플래그 레지스터에 있는 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인. >> 하드웨어 인터럽트에는 모든 인터럽트를 인터럽트 플래그로 막을 수 있진 않아. 막을수 있는 인터럽트와 막을수 없는 인터럽트로 나뉨
  4. 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업(스택영역에 백업)함.
  5. CPU는 인터럽트 벡터*를 참조하여 인터럽트 서비스 루틴*을 실행함.
  6. 인터럽트 서비스 루틴 실행이 끝나면 백업해 둔 작업을 복구하여 실행을 재개.

* 인터럽트 벡터 : 각각의 인터럽트를 구분하기 위한 정보.

* 인터럽트 서비스 루틴 :

인터럽트가 발생했 을 때 해당 인터럽트를 어떻게 처리하기 위한 프로그램. 프로그램이기에 메모리에 저장.

ex> 키보드가 인터럽트 요청을 보내면 이렇게 행동해야 함.

CPU가 인터럽트를 처리한 다라는 의미 >> 인터럽트 서비스 루틴을 실행하고, 본래 수행하던 작업으로 다시 되돌아온다.(+ 그리고 인터럽트의 시작 주소는 인터럽트 벡터를 통해 알 수 있다.)

728x90

명령어의 구조

저급언어에는 기계어와 어셈블리어로 이루어져 있는데 이런 저급언어는 명령어들로 이루어져 있음.

명령어의 구조 ( == 연산 코드 + 오퍼랜드)

연산 코드(수행할 연산) + 오퍼랜드(연산에 사용될 데이터 혹은 연산에 사용될 데이터가 저장된 위치(==주소필드))

**오퍼랜드의 개수는 여러개가 될수도 있고 하나도 없을 수도 있다.(하나도 없는경우 0주소, 한개인 경우 1주소, 두개인 경우 2주소 등 오퍼팬드의 갯수에 따라 "갯수+ 주소"로 불릴수 있음.)

연산코드란 수행할 연산을 뜻함

  • 연산 코드의 종류와 생김새는 CPU에 따라 다르지만 공통적으로 들어가는 요소들 4가지가 있음(1. 데이터 전송. 2.산술/논리 연산. 3. 제어 흐름 변경. 4. 입출력 제어)

대표적인 연산 코드의 종류

  1. 데이터 전송
  • move : 데이터를 옮겨라
  • store : 메모리에 저장하라
  • load(fetch) : 메모리에서 CPU로 데이터를 가져와라
  • push : 스택에 데이터를 저장하라
  • pop : 스택의 최상단 데이터를 가져와라
  1. 산술/논리 연산
  • ADD/ SUBTRACT/ MULTIPLY / DIVIDE: 덧셈, 뺄셈, 곱셈, 나눗셈을 수행해라
  • INCREMENT / DECREMENT: 오퍼랜드에 1을 더해라, 1을 빼라
  • AND / OR/ NOT:AND / OR / NOT 연산을 수행하라
  • COMPARE: 두개의 숫자 또는 TRUE/FALSE값을 비교해라
  1. 제어흐름 변경 - 특정 메모리 주소로 실행의 순서를 옮기는 연산코드
    • JUMP: 특정 주소로 실행 순서를 옮겨라
    • CONDITIONAL JUMP : 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라.
    • HALT : 프로그램의 실행을 멈춰라
    • CALL : 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
    • RETURN : CALL을 호출할 때 저장했던 주소로 돌아가라
    • *call과 return : 특정 함수를 실행하고 다시 돌아가라
  2. 입출력 제어
  • READ(INPUT): 특정 입출력 장치로부터 데이터를 읽어라
  • WRITE(OUTPUT): 특정 입출력 장치로 데이터를 써라
  • START IO: 입출력 장치를 시작하라
  • TEST IO: 입출력 장치의 상태를 확인하라

오퍼랜드에 저장된 위치인 주소값으로 저장하는 이유

  • 하나의 오퍼랜드에 표현될 수 있는 데이터의 크기가 훨씬 커짐

명령어 주소 지정 방식

  • 유효주소(effective adress): 연산에 사용할 데이터가 저장된 위치
  • 명령어 주소 지정방식(addressing modes): 연산에 사용할 데이터가 저장된 위치를 찾는 방법 == 유효 주소를 찾는 방법, 다양한 명령어 주소 지정 방식들이 있음.

명령어 주소 지정 방식

  • 즉시 주소 지정 방식(immediate addressing mode): 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시, 가장 간단한 형태의 주소 지정 방식, 단점으론 연산에 사용할 데이터의 크기가 작아질수 있지만 빠름.
  • 직접 주소 지정 방식(direct addressing mode) : 오퍼랜드 필드에 유효 주소 직접적으로 명시, 단점으론 유효 주소를 표현할 수 있는 크기가 연산 코드만큼 줄어듦.
  • 간접 주소 지정 방식(indirect addressing mode): 오퍼랜드 필드에 유효 주소의 주소를 명시, 단점으론 앞선 주소지정 방식들에 비해 속도가 느림. >>메모리를 뒤적뒤적해서 느림
  • 레지스터 주소 지정 방식(register addressing mode): 연산에 사용할 데이터가 저장된 레지스터 명시, 메모리에 접근하는 속도보다 레지스터에 접근하는 것이 빠름.
  • 레지스터 간접 주소 지정 방식(register indirect addressing mode) : 연산에 사용할 데이터를 메모리에 저장, 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시
728x90

+ Recent posts