소스 코드와 명령어
고급 언어와 저급 언어
고급 언어: 개발자가 읽고 쓰기 편하게 만들어진 언어
저급 언어: 컴퓨터가 명령을 이해하고 실행할 수 있도록 만들어진 언어
저급 언어
- 기계어와 어셈블리어가 있음
- 기계어는 0과 1로 이루어진 명령어로 구성된 저급 언어이다.
- 어셈블리어는 0과 1로 이루어진 기계어를 읽기 편한 형태로 번역한 저급 언어이다.
고급 언어(c, c++ python, java 등)
고급 언어가 저급 언어로 변환되는 방식은 두 가지가 있다. 컴파일과 인터프리트 방식
컴파일 언어
고급 언어 -> 컴파일 -> 저급언어
소스 코드 -> 컴파일러 -> 목적 코드
- 컴파일 언어로 작성된 소스 코드는 컴파일러에 의해 저급 언어로 변환되고 (이 과정을 컴파일이라고 한다.) 컴파일 결과로 저급 언어인 목적 코드가 생성된다. (한 줄씩 실행되는 것이 아니라 한 번에 컴파일)
인터프리트 언어
- 인터프리터에 의해 한 줄씩 실행
- 소스 코드 전체가 저급 언어로 변환되기까지 기다릴 필요가 없다.
컴파일 언어: 소스 코드 컴파일 중 오류가 발생하면 소스 코드 전체가 실행되지 않음
인터프리터 언어: 소스 코드 인터프리트 중 오류가 발생하면 오류 발생 전까지의 코드는 실행
세상 모든 프로그래밍 언어가 컴파일 언어와 인터프리트 언어로 구분되는가?
- No, 경계가 애매한 경우가 있다. 흑과 백처럼 양분되는 개념이라기보다는 컴파일 방식과 인터프리터 방식이 있는데 이는 고급 언어가 저급 언어로 변환되는 대표적인 방식이라고 기억하는 게 좋다.
명령어의 구조
- 무엇을 대상으로 무엇을 실행하라.
- 기계어, 어셈블리어도 명령어이다.
- 명령어는 연산 코드와 오퍼랜드로 구성된다.
연산 코드: 수행할 연산
오퍼랜드: 연산에 사용될 데이터 혹은 연산에 사용될 데이터가 저장된 위치(주소 필드)
오퍼랜드가 없는 경우 (0-주소 명령어)
연산 코드
오퍼랜드가 한 개인 경우 (1-주소 명령어)
연산 코드 오퍼랜드
오퍼랜드가 두 개인 경우 (2-주소 명령어)
연산 코드 오퍼랜드 오퍼랜드
오퍼랜드가 세 개인 경우 (3-주소 명령어)
연산코드 오퍼랜드 오퍼랜드 오퍼랜드
연산 코드: 수행할 연산
- 데이터 전송
- 산술/논리 연산
- 제어 흐름 변경
- 입출력 제어
* 연산코드의 종류와 생김새는 cpu마다 다르다.
대표적인 연산 코드의 종류
데이터 전송
* MOVE: 메모리 옮기기
* STORE: 메모리에 저장
* LOAD (FETCH): 메로리에서 CPU로 데이터를 가져오기
* PUSH: 스택에 데이터 저장
* POP: 스택 최상단 데이터 가져오기
산술/논리 연산
* ADD / SUBTRACT / MULTIPLY / DIVIDE: 덧셈 / 뺄셈 / 곱셈 / 나눗셈을 수행해라
* INCREMENT / DECREMENT: 오퍼랜드에 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: 입출력 장치의 상태를 확인해라
저장된 위치를 사용하는 이유
- 명령어에서 표현할 수 있는 데이터의 크기가 제한되어있기 때문이다.
- 16비트 기준, 3-주소 명령어에서 표현할 수 있는 데이터의 크기는 2^4
- 주소를 가져오면 2^16을 표현할 수 있다. (오퍼랜드에 주소 표기, 주소값에는 2^16 크기만큼의 데이터 저장)
명령어 주소 지정 방식
유효 주소(effective address)
- 연산에 사용할 데이터가 저장된 위치
명령어 주소 지정 방식 (addressing modes)
- 연산에 사용할 데이터가 저장된 위치를 찾는 방법
- 유효 주소를 찾는 방법
- 다양한 명령어 주소 지정 방식이 존재
즉시 주소 지정 방식 (immediate addressing mode)
- 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시
- 가장 간단한 형태의 주소 지정 방식
- 연산에 사용할 데이터의 크기가 작아질 수 있지만 빠르다.
직접 주소 지정 방식 (direct addressing mode)
- 오퍼랜드 필드에 유효 주소 직접적으로 명시
- 유효 주소를 표현할 수 있는 크기가 연산 코드만큼 줄어든다.
간접 주소 지정 방식 (indirect addressing mode)
- 오퍼랜드 필드에 유효 주소의 주소를 명시
- 앞선 주소 지정 방식들에 비해 속도가 느리다.
레지스터 주소 지정 방식 (register addressing mode)
- 위 방법들은 메모리에 주소 명시
- 연산에 사용할 데이터가 저장된 레지스터 명시
- 메모리에 접근하는 속도보다 레지스터에 접근하는 것이 빠름
레지스터 간접 주소 지정 방식 (register indirect addressing mode)
- 연산에 사용할 데이터를 메모리에 저장
- 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시
'컴퓨터 구조' 카테고리의 다른 글
[컴퓨터구조] 빠른 CPU를 위한 설계 (0) | 2024.03.15 |
---|---|
[컴퓨터구조] CPU (1) | 2024.03.14 |
[컴퓨터구조] 컴퓨터가 0과 1로 숫자 및 문자를 표현하는 방법 (1) | 2024.03.08 |
[컴퓨터구조] 컴퓨터의 핵심 부품 4가지 (0) | 2024.03.06 |
[컴퓨터구조] 컴퓨터 구조를 배우는 이유 (0) | 2024.03.06 |