명령어
명령어는 수행할 동작과 수행할 대상으로 이루어져 있다. 수행할 대상은 수행할 동작에 사용될 데이터 자체가 될 수 있고, 동작에 사용될 데이터가 저장된 위치가 될 수 있다.
여기서 '명령어가 수행할 동작'은 연산 코드(opcode)라고 하고, '동작에 사용될 데이터', '동작에 사용될 데이터가 저장된 위치'는 오퍼랜드(operand)라고 한다.
즉, 하나의 명령어는 연산 코드와 0개 이상의 오퍼랜드로 구성되어 있다.
오퍼랜드에 데이터가 저장된 위치를 명시할 수 있다고 했는데, 이런 경우 주의할 점이 있다. 주소(메모리주소나 레지스터의 이름)이 명시되어 있기 때문에 이 명령어가 실행되기 위해선 추가 메모리 접근이 더 필요할 수 있다.
연산코드
명령어의 연산코드는 매우 다양하다.
- 데이터 전송
- MOVE : 데이터를 옮겨라
- STORE : 메모리에 저장하라
- LOAD(FETCH) : 메모리에서 CPU로 데이터를 가져와라
- PUSH : 스택에 데이터를 저장하라
- POP : 스택의 최상단 데이터를 가져와라
- 산술/논리 연산
- ADD/SUBTRACT/MULTIPLY/DIVIDE : 덧셈/뺄셈/곱셈/나눗셈
- INCREMENT/DECREMENT : 오퍼랜드에 1을 더하라/빼라
- AND/OR/NOT : 논리 연산을 수행하라
- COMPARE: 두 개의 숫자 또는 TRUE/FALSE 값을 비교하라
- 제어 흐름 변경
- JUMP : 특정 주소로 실행순서를 옮겨라
- CONDITIONAL JUMP : 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
- HALT : 프로그램의 실행을 멈춰라
- CALL : 되돌아올 주소를 저장할 채 특정 주소로 실행 순서를 옮겨라
- RETURN : CALL을 호출할 때 저장했떤 주소로 돌아가라
- 입출력 제어
- READ(INPUT) : 특정 입출력 장치로부터 데이터를 읽어라
- WRTIE(OUTPUT) : 특정 입출력 장치로부터 데이터를 써라
- START IO : 입출력 장치를 시작하라
- TEST IO : 입출력 장치의 상태를 확인하라
스택(stack)
여기서 PUSH, POP 명령어는 스택에 대한 연산이다.
스택은 한 쪽 끝이 막혀 있는 통과 같은 형태로 데이터를 관리하는 자료구조이다.
스택은 한 쪽이 막혀 있기 때문에 데이터를 저장할 때는 막혀 있지 않은 쪽으로 차곡차곡 저장하고, 저장한 자료를 빼낼 때는 마지막으로 저장한 데이터부터 빼내서 관리한다.
LIFO(Last In First Out) - 나중에 저장한 데이터를 가장 먼저 빼내는 데이터 관리 방식(후입선출)
기계어와 어셈블리어
CPU는 0과 1로 표현된 데이터와 명령어를 이해할 수 있다. 이때 CPU가 이해할 수 있도록 0과 1로 표현된 정보를 있는 그대로 표현한 언어가 기계어(machine code)이다.
하지만 기계어는 이것이 어떤 프로그램인지 알 수가 없다. 그래서 등장한 것이 어셈블리어(assembly language)이다. 어셈블리어는 0과 1로 표현된 기계어를 읽기 편한 형태로 단순 번역한 언어이다.
단, 주의할 점은 CPU의 종류에 따라 연산 코드와 레지스터 이름등이 다를 수 있어 다르게 표현될 수 있다.
CPU가 다르면 기계어와 어셈블리어도 달라질 수 있다.
명령어 사이클
메모리안에는 프로그램이 저장되어 있고, 이 프로그램은 여러 명령어로 구성되어 있다. 그리고 CPU는 이 메모리에서 명령어를 인출하고 실행하기를 반복하여 전체 프로그램을 실행해나간다.
여기서 CPU가 명령어를 처리하는 과정은 정형화된 구조가 있다. CPU는 명령어를 처리하는 과정에서 프로그램 속 각각의 명령어들은 일정한 주기를 반복하여 실행한다. 이 과정을 명령어 사이클(instruction cycle)이라 한다.
- 인출 사이클(fetch cycle) : 메모리에 있는 명령어를 CPU로 가지고 오는 단계
- 실행 사이클(execution cycle) : CPU로 인출한 명령어를 실행하는 단계
그렇기 때문에 간단한 프로그램을 실행하기 위해선 인출 사이클과 실행 사이클은 반복하게 된다.
하지만 모든 명령어가 이렇게 간단하지는 않다. 위 그림과 같이 메모리 접근 명령어가 잇을 경우 다음과 같은 사이클을 타게 된다. 이 경우 CPU가 명령어를 인출하더라도 한 번 더 메모리에 접근해야 한다.
이렇게 명령어 실행 전에 한 번 더 메모리에 접근하는 단계를 간접 사이클(indirect cycle)이라고 한다. 마지막으로 중요한 사이클 중 하나인 인터럽트를 처리하는 인터럽트 사이클이다. 이건 CPU 레지스터의 이해가 필요하므로 CPU 학습에 추가적으로 작성하겠다.
참고
이것이 취업을 위한 컴퓨터 과학이다 with CS 기술 면접 - 강민철
https://kyumcoding.tistory.com/39
'Knowledge > 컴퓨터구조&운영체제' 카테고리의 다른 글
[컴퓨터구조] CPU 성능 향상을 위한 설계 (클럭, 코어, 스레드) (0) | 2024.11.25 |
---|---|
[컴퓨터구조] CPU - 인터럽트 (0) | 2024.11.08 |
[컴퓨터구조] CPU - 레지스터 (0) | 2024.10.31 |
[컴퓨터구조] 컴퓨터가 이해하는 정보 - 데이터 (0) | 2024.10.28 |
[컴퓨터 구조] 컴퓨터 구조의 큰 그림 (0) | 2024.10.21 |