3-1. 소스 코드와 명령어
1. 고급 언어와 저급 언어
-
고급 언어 : 사람을 위한 언어
-
저급 언어 : 컴퓨터가 직접 이해하고 실행할 수 있는 언어
- 컴퓨터가 이해하고 실행할 수 있는 언어는 오직 저급 언어 뿐
- 고급 언어로 작성된 소스 코드가 실행되려면 반드시 저급 언어(명령어)로 변환 되어야 함
-
저급 언어의 종류
-
기계어 : 0과 1의 명령어 비트로 이루어진 언어
-
어셈블리어 : 기계어를 읽기 편한 형태로 번역한 언어
- 개발자들에게 어셈블리어는 '관찰의 대상'이기도 함
- 어셈블리어를 읽으면 컴퓨터가 프로그램을 어떤 과정으로 실행하는지, 프로그램이 어떤 절차로 작동하는지 가장 근본적인 단계부터 추적하고 관찰할 수 있기 때문
2. 컴파일 언어와 인터프리터 언어
1) 고급 언어가 저급 언어로 변환되는 방식
2) 각 언어
- 컴파일 언어 : 컴파일 방식으로 작동하는 프로그래밍 언어
- 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어(대표적으로 C)
- 컴파일 : 컴파일 언어로 작성된 소스 코드의 코드 전체가 저급 언어로 변환되는 과정
- 컴파일러 : 컴파일을 수행하는 도구
- 목적 코드 : 컴파일러를 통해 저급 언어로 변환된 코드
/
- 인터프리터 언어 : 인터프리트 방식으로 작동하는 프로그래밍 언어
- 인터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급 언어(python)
- 인터프리터 : 소스 코드를 한 줄씩 저급 언어로 변환하여 실행하는 도구. 변환하는 시간을 기다릴 필요 없음
3. 목적 파일 vs 실행 파일
- 목적 파일
- 목적 코드로 이루어진 파일
- 목적 코드가 실행 파일이 되기 위해서 링킹 작업 거쳐야 함
- 실행 파일
- 실행 코드로 이루어진 파일(.exe 확장자를 가진 파일)
/
3-2. 명령어의 구조
1. 연산 코드와 오퍼랜드
- 명령어 : 연산 코드 + 오퍼랜드 구성
- 연산 코드(operation code) : 명령어가 수행할 연산
- 오퍼랜드(operand) : 연산에 사용할 데이터, 연산에 사용할 데이터가 저장된 위치
- 연산 코드가 담기는 영역은 연산 코드 필드, 오퍼랜드가 담기는 영역은 오퍼랜드 필드라고 함
/
- 오퍼랜드
- 오퍼랜드 필드에는 데이터, 메모리, 레지스터 주소가 올 수 있음
- 주소 필드라고도 함
- 오퍼랜드는 명령어 안에 하나도 없을 수도 있고, 여러 개가 있을 수도 있음. (하나도 없는 명령어 : 0-주소 명령어, 하나인 명령어 : 1-주소 명령어 등)
/
- 연산 코드
- 유형 4가지
- 데이터 전송
- 산술/논리 연산
- 제어 흐름 변경
- 입출력 제어
2. 주소 지정 방식
- 오퍼랜드 필드에 메모리나 레지스터 주소를 담는 이유 : 명령어 길이 때문
만약 오퍼랜드 필드 안에 메모리 주소가 담긴다면 표현할 수 있는 데이터의 크기는 하나의 메모리 주소에 저장할 수 있는 공간만큼 커짐
-
유효 주소 : 연산 코드에 사용할 데이터가 저장된 위치, 연산의 대상이 되는 데이터가 저장된 위치
-
주소 지정 방식 : 오퍼랜드 필드에 데이터가 저장된 위치를 명시할 때 연산에 사용할 데이터 위치를 찾는 방식. 유효 주소를 찾는 방식
-
즉시 주소 지정 방식 : 오퍼랜드 필드에 직접 명시
-
직접 주소 지정 방식 : 오퍼랜드 필드에 유효 주소를 직접적으로 명시
-
간접 주소 지정 방식 : 유효 주소의 주소를 오퍼랜드 필드에 명시
-
레지스터 주소 지정 방식 : 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시
-
레지스터 간접 주소 지정 방식 : 연산에 사용할 데이터를 메모리에 저장하고, 그 주소(유효 주소)를 저장한 레지스터를 오퍼랜드 필드에 명시
[정리]
-
주소 지정 방식 : 연산에 사용할 데이터를 찾는 방법
-
유효 주소 : 연산에 사용할 데이터가 저장된 위치
-
즉시 주소 지정 방식 : 연산에 사용할 데이터
-
직접 주소 지정 방식 : 유효 주소(메모리 주소)
-
간접 주소 지정 방식 : 유효 주소의 주소
-
레지스터 주소 지정 방식 : 유효 주소(레지스터 이름)
-
레지스터 간접 주소 지정 방식 : 유효 주소를 저장한 레지스터
[추가 숙제] 스택과 큐 정리하기
1. 스택(stack)
- 나중에 저장한 데이터를 가장 먼저 빼냄(후입선출, LIFO)
- push : 새로운 데이터 저장하는 명령어
- pop : 저장된 데이터 꺼내는 명령어
- 큐(queue)
- 가장 먼저 저장된 데이터부터 빼냄(선입선출, FIFO)