고급 언어와 저급 언어
- 사람을 위한 언어를 고급 언어라고 한다.
- 컴퓨터가 직접 이해하고 실행할 수 있는 언어를 저급 언어라고 한다.
- 저급 언어에는 기계어, 어셈블리어가 있다.
- 기계어란 0과 1의 명령어 비트로 이루어진 언어이다.
- 어셈블리어는 0과 1로 이루어진 기계어를 읽기 편한 형태로 번역한 저급 언어이다.
컴파일 언어와 인터프리터 언어
- 컴파일 방식으로 작동하는 프로그래밍 언어를 컴파일 언어, 인터프리트 방식으로 작동하는 프로그래밍 언어를 인터프리터 언어라고 한다.
컴파일 언어
- 컴파일 언어는 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어이다.
- 컴파일을 수행해 주는 도구를 컴파일러라고 한다.
- 컴파일러를 통해 저급 언어로 변환된 코드를 목적 코드라고 한다.
인터프리터 언어
- 인터프리터 언어는 인터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급 언어이다.
- 소스 코드를 한 줄씩 저급 언어로 변환하여 실행해 주는 도구를 인터프리터라고 한다.
목적 파일 vs 실행 파일
- 목적 코드로 이루어진 파일을 목적 파일이라고 한다.
- 목적 코드가 실행 파일이 되기 위해서는 링킹이라는 작업을 거쳐야 한다.
명령어의 구조
- 명령어는 연산 코드와 오퍼랜드로 구성되어 있다.
- 명령어가 수행할 연산을 연산 코드라고 한다.
- 연산 코드는 연산자, 오퍼랜드는 피연산자라고 한다.
- 연산 코드가 담기는 영역을 연산 코드 필드라고 부르고, 오퍼랜드가 담기는 영역을 오퍼랜드 필드라고 한다.
오퍼랜드
- 오퍼랜드 필드에는 많은 경우 연산에 사용할 데이터가 저장된 위치, 즉 메모리 주소나 레지스터 이름이 담긴다.
- 오퍼랜드 필드를 주소 필드라고 한다.
- 오퍼랜드가 하나도 없는 명령어: 0-주소 명령어
- 오퍼랜드가 하나인 명령어: 1-주소 명령어
- 오퍼랜드가 두 개인 명령어:2-주소 명령어
- 오퍼랜드가 세 개인 명령어:3-주소 명령어
연산 코드
- 연산 코드 유형은 크게 네 가지로 나눌 수 있다.
- 데이터 전송
- MOVE: 데이터를 옮겨라
- STORE: 메모리에 저장하라
- LOAD(FETCH): 메모리에서 CPU로 데이터를 가져와라
- PUSH: 스택에 데이터를 저장하라
- POP: 스택의 최상단 데이터를 가져와라.
- 산술/논리 연산
- ADD / SUBTRACT / MULTIPLY / DIVIDE: 덧셈 / 뺄셈 / 곱셈 / 나눗셈을 수행하라
- INCREMENT / DECREMENT: 오퍼랜드에 1을 더하라/ 빼라
- ADD / OR /NOT: AND / OR / NOT 연산을 수행해라
- COMPARE: 두 개의 숫자 또는 TRUE / FALSE 값을 비교하라
- 제어 흐름 변경
- JUMP: 특정 주소로 실행 순서를 옮겨라
- CONDITIONAL JUMP: 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
- HALT: 프로그램의 실행을 멈춰라
- CALL: 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
- RETURN: CALL을 호출할 때 저장했던 주소로 돌아가라
- 입출력 제어
- READ(INPUT) : 특정 입출력 장치로부터 데이터를 읽어라
- WRITE(OUTPUT): 특정 입출력 장치로부터 데이터를 써라
- START IO: 입출력 장치를 시작하라
- TEST IO: 입출력 장치의 상태를 확인하라
주소 지정 방식
- 오퍼랜드 필드에 왜 메모리나 레지스터의 주소를 담을까?
→ 명령어의 길이 때문이다. 하나의 명령어가 N비트로 구성되어 있고, 연산 코드 필드가 m비트라고 가정해보자. 1-주소 명령어의 오퍼랜드 필드의 길이는 n-m비트가 된다.
- 명령어의 크기가 16비트, 연산 코드 필드가 4비트인 2-주소 명령어에서는 오퍼랜드 필드당 6비트 정도밖에 남지 않는다 → 하나의 오퍼랜드 필드로 표현할 수 있는 정보의 가짓수는 2^6개 이다.
- 오퍼랜드 필드 안에 메모리 주소가 담긴다면 표현할 수 있는 데이터의 크기는 하나의 메모리 주소에 저장할 수 있는 공간만큼 커진다.
→ 예를 들어, 16비트를 저장할 수 있는 메모리가 있다고 가정해 보자. 이 메모리 안에 데이터를 저장하고, 오퍼랜드 필드 안에 해당 메모리 주소를 명시한다면 표현할 수 있는 정보의 가짓수가 2^16개로 커진다.
→ 오퍼랜드 필드에 메모리 주소가 아닌 레즈스터 이름을 명시할 때도 같다.
- 연산 코드에 사용할 데이터가 저장된 위치를 유효 주소라고 한다.
- 오퍼랜드 필드에 데이터가 저장된 위치를 명시할 때 연산에 사용할 데이터 위치를 찾는 방법을 주소 지정 방식이라고 한다.
즉시 주소 지정 방식
- 즉시 주소 지정 방식은 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방법
- 데이터의 크기가 작아지는 단점이 있지만 연산에 사용할 데이터를 메모리나 레지스터로부터 찾는 과정이 없기 때문에 빠르다.
직접 주소 지정 방식
- 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방법
- 오퍼랜드 필드에서 표현할 수 있는 데이터의 크기는 즉시 주소 지정 방식보다 더 커졌지만, 여전히 유효 주소를 표현할 수 있는 범위가 연산 코드의 비트 수 만큼 줄어듦
간접 주소 지정 방식
- 간접 주소 지정 방식은 유효 주소의 주소를 오퍼랜드 필드에 명시한다.
- 직접 주소 지정 방식보다 표현할 수 있는 유효 주소의 범위가 더 넓어졌다.
- 두 번의 메모리 접근이 필요하기 때문에 앞서 설명한 주소 지정 방식들보다 일방적으로 느린 방식이다.
레지스터 주소 지정 방식
- 레지스터 주소 지정 방식은 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방법이다.
- CPU 내부에 있는 레지스터에 접근하는 것이 더 빠르다. 레지스터 주소 지정 방식은 직접 주소 지정 방식보다 빠르게 데이터에 접근할 수 있다.
- 표현할 수 있는 레지스터 크기에 제한이 생길 수 있다.
레지스터 간접 주소 지정 방식
- 연산에 사용할 데이터를 메모리에 저장하고, 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방법이다.
- 메모리에 접근하는 횟수가 한 번으로 줄어든다는 장점
- 레지스터 간접 주소 지정 방식은 간접 주소 지정 방식보다 빠르다.
- 연산에 사용할 데이터를 찾는 방법은 주소 지정 방식
- 연산에 사용할 데이터가 저장된 위치를 유효 주소라고 한다.
[오퍼랜드 필드에 명시하는 값 정리]
- 즉시 주소 지정 방식 : 연산에 사용할 데이터
- 직접 주소 지정 방식 : 유효 주소
- 간접 주소 지정 방식 : 유효 주소의 주소
- 레지스터 주소 지정 방식 : 유효 주소
- 레지스터 간접 주소 지정 방식 : 유효 주소를 저장한 레지스터
'📗 BOOK > 혼자 공부하는 컴퓨터구조+운영체제' 카테고리의 다른 글
혼자 공부하는 컴퓨터 구조+운영체제 7장 정리 (0) | 2024.07.25 |
---|---|
혼자 공부하는 컴퓨터 구조+운영체제 6장 정리 (0) | 2024.07.19 |
혼자 공부하는 컴퓨터 구조+운영체제 5장 정리 (0) | 2024.07.16 |
혼자 공부하는 컴퓨터 구조+운영체제 2장 정리 (0) | 2024.07.10 |
혼자 공부하는 컴퓨터 구조+운영체제 1장 정리 (0) | 2024.07.09 |