이 글은 혼자 공부하는 컴퓨터 구조 + 운영체제 (저자 : 강민철)의 책과 유튜브 영상을 참고하여 개인적으로 정리하는 글이라는 것을 알립니다!!
1. 소스 코드와 명령어
컴퓨터는 프로그래머가 작성한 소스 코드(고급 언어)를 이해하지 못합니다. 그래서 저급 언어 0과 1로 표현된 기계어 및 어셈블리로 번역해야 합니다.

그림 1. 기계어

해당 코드는 비트의 모임이며, 실제로 프로그래머가 작성한 코드를 기준으로 컴퓨터는 변환해서 읽고 있습니다.
2. 인터프리터와 컴파일
고급 언어의 변환 방식은 크게 두 가지로 나뉩니다. 컴파일과 인터프리터입니다.
1. 컴파일 언어
- 컴파일 언어는 프로그램이 실행 되기 이전에 저급 언어로 변환하는 것을 말합니다.
- 컴파일러를 통해서 문법의 오류를 검사하고 문제가 없다면 목적 코드로 변환합니다.
- 만약 하나의 에러라도 발생한다면, 컴파일이 실패합니다.
- 프로그램 실행시, 이미 번역된 목적 코드를 제공하므로 프로그램 속도가 빠릅니다.

2. 인터프리터 언어
- 인터 프리터는 코드를 한 줄씩 실행합니다.
- 인터프리터는 N번째에서 오류가 난다면, N - 1 번째 까지는 정상적으로 실행합니다.
- 프로그램 실행시, 저급 언어로 번역을 하는 작업이 일어나므로, 컴파일보다 속도가 느립니다.
3. 목적 파일과 실행 파일
- 목적 파일
- 목적 파일은 목적 코드로 이루어진 파일을 말합니다.
- 실행 파일
- .exe 파일 확장자를 가진 것이 대표적인 실행 파일입니다.
- 차이점
- 실행 파일은 목적 파일에 링킹 작업을 거친 것을 말합니다.
링킹(linking)?
링킹은 각 기능 단위를 가진 다른 파일의 함수를 호출할 때, 목적 파일간 연결하는 작업을 말합니다.
4. 명령어의 구조
연산 코드와 오퍼랜드
명령어는 연산 코드와 오퍼랜드로 이뤄진 것을 말합니다.

- 색이 있는 필드를
연산코드라고 말하며, 흰색 필드는오퍼랜드입니다. 연산코드는 명령어는 수행할 연산입니다.오퍼랜드는 '실제 연산에 사용될 데이터' 또는 '연산에 사용할 데이터가 저장된 위치'입니다.
오퍼랜드
오퍼랜드는 숫자, 문자와 같은 실제 데이터를 가지거나 메모리, 레지스터 주소의 주소 데이터를 가집니다.
하지만, 오퍼랜드 필드는 데이터를 직접 명시하는 것 보다 메모리 주소, 레지스터 이름을 담습니다.
그래서 보통 오퍼랜드 필드를 주소 필드라고 합니다.

한 가지 명령어의 오퍼랜드는 보통 0개 ~ 3개 가질 수 있습니다. 더 많은 오퍼랜드를 가질 수 있는 몇몇 아키텍처가 존재하긴 합니다. 혹시 궁금하시다면 CISC 아키텍처로 검색해서 찾아보시는 것을 추천합니다.
명령어를 말할 때, 오퍼랜드 갯수가 y라면, y-주소 명령어라고 표현할 수 있습니다.

연산 코드
연산코드는 여러 연산을 담당하는 명령어들이 존재합니다. 알아보도록 합시다.
- 데이터 전송
- MOVE: 데이터를 옮겨라
- STORE: 메모리에 저장하라
- LOAD(FETCH): 메모리에서 CPU로 데이터를 가져와라
- PUSH: 스택에 데이터를 저장하라
- POP: 스택의 최상단 데이터를 가져와라
- 산술/논리 연산
- ADD / SUBTRACT / MULTIPLY / DIVIDE: 덧셈/ 뺄셈 / 곱셈 / 나눗셈을 수행하라
- INCREMENT / DEGREMENT: 오퍼랜드에 1을 더하라 / 오퍼랜드에 1을 빼라
- AND / OR / NOT: AND / OR / NOT 연산을 수행하라
- COMPARE: 두 개의 숫자 또는 TRUE / FALSE 값을 비교하라
- 제어 흐름 변경
- JUMP: 특정 주소로 실행 순서를 옮겨라.
- CONDITIONAL JUMP: 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
- HALT: 프로그램의 실행을 멈춰라
- CALL: 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
- RETURN: CALL을 호출할 때 저장했던 주소로 돌아가라
- 입출력 제어
- READ(INPUT): 특정 입출력 장치로부터 데이터를 읽어라
- WRITE(OUTPUT): 특정 입출력 장치로 데이터를 써라
- START IO: 입출력 장치를 시작하라
- TEST IO: 입출력 장치의 상태를 확인하라
5. 주소 지정 방식
왜 오퍼랜드에는 주소 정보가 들어가는 것일까요?
만약 16비트의 명렁어가 있고 연산코드가 4비트라고 가정한 이후, 3-주소명령어라고 생각 해보겠습니다.
그렇다면, 사용 가능한 비트는 12비트, 3으로 나눈다면 하나의 주소필드에 표현할 수 있는 가짓수는 24 입니다.

"16가지로는 많은 데이터를 표현하기 힘들겠죠?"
그래서, 메모리 주소나 레지스터의 이름을 명시하면 더 많은 가짓수를 표현 가능하게 됩니다.
여러가지 지정 방식 방법을 알아보겠습니다.
- 즉시 주소 지정 방식
즉시 주소 지정 방식은 오퍼랜드 필드에 값을 직접 명시하는 것 입니다. 다른 주소 지정 방식보다 빠르지만, 표현할 수 있는 데이터의 크기가 작아집니다

- 직접 주소 지정 방식
직접 주소 지정 방식은 오퍼랜드에 유효 주소를 직접적으로 명시하는 것입니다. 데이터를 표현할 수 있는 크기는 늘었지만, 오퍼랜드 필드의 길이가 연산 코드의 길이에 영향을 받아 짧아져 표현할 수 있는 유효 주소의 크기에 제한이 생길 수 있습니다.

- 간접 주소 지정 방식
간접 주소 지정 방식은 유효 주소의 주소를 오퍼랜드 필드에 명시하는 것입니다. 유효 주소의 범위는 늘었지만,
두 번의 메모리 접근으로 다른 방식보다 일반적으로 느립니다.

- 레지스터 주소 지정 방식
레지스터 주소 지정 방식은 오퍼랜드 필드에 데이터를 저장한 레지스터를 직접적으로 명시하는 것입니다.
Cpu 외부의 메모리 접근보다 레지스터 접근이 속도가 빠릅니다. 하지만, 유효 주소로 표현할 수 있는 레지스터 크기에제한이 생길 수 있습니다

- 레지스터 간접 주소 지정 방식
레지스터 간접 주소 지정 방식은 유효 주소의 범위는 늘었지만, 간접 지정 주소 방식보다 한 번의 메모리 접근으로 간접 주소 지정 방식 보다 빠릅니다.

주소 지정 방식 속도 정리
5가지의 경우의 처리 속도를 비교하자면,
즉시 주소 지정 방식 -> 레지스터 주소 지정 방식 -> 직접 주소 지정 방식 -> 레지스터 간접 주소 지정 방식 -> 간접 주소 지정 방식 순서대로 일반적으로 더 빠르게 데이터를 다룬다고 말할 수 있습니다.
긴 글 읽어주셔서 감사합니다.
'ComputerScience > 컴퓨터 구조' 카테고리의 다른 글
| [컴퓨터 구조] 메모리와 캐시 메모리 (4) | 2024.08.30 |
|---|---|
| [컴퓨터 구조] CPU 성능 상향 기법 (0) | 2024.08.29 |
| [컴퓨터 구조] CPU의 작동 원리 (1) | 2024.08.28 |
| [컴퓨터 구조] 0과 1로 표현하는 데이터 (0) | 2024.04.21 |
| [컴퓨터구조] 큰 그림에서 보는 컴퓨터 구조 (0) | 2024.04.17 |
