[혼공컴운] Ch03 정리
1. 소스 코드와 명령어
1. 고급 언어와 저급 언어
-
고급 언어(high-level programming language)
- 프로그램을 만들 때 컴퓨터가 이해하는 언어가 아닌 사람이 이해하고 작성하기 쉽게 만들어진 언어
- C, C++, java, Python..
-
저급 언어(low-level programming language)
-
컴퓨터가 직접 이해하고 실행할 수 있는 언어 ➡ 기계어, 어셈블리어
-
고급 언어로 작성된 소스 코드가 실행되려면 반드시 저급 언어(명령어)로 변환되어야 한다.
-
기계어(machine code) : 0과1로 이루어진 명령어 모음
- 이진수로 나열하면 너무 길어지기 때문에 십육진수로 표현하기도 한다.
-
어셈블리어(assembly language) :
- 기계어를 읽기 편한 형태로 번역한 언어
-
2. 컴파일 언어와 인터프리터 언어
-
개발자들이 고급 언어로 작성한 소스 코드는 저급 언어로 변환되어 실행된다.
-
고급언어에서 저급언어로 변환되는 방식 ➡ 컴파일 방식, 인터프리트 방식
-
컴파일 언어(compile language) : 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어
-
대표 언어 : C
-
컴파일(compile) : 컴파일 언어로 작성된 소스 코드의 코드 전체가 저급 언어로 변환되는 과정
-
컴파일러(compiler) : 컴파일을 수행해 주는 도구
- 코드 내에 오류가 하나라도 있으면 컴파일이 불가능
-
목적코드(object code) : 컴파일러를 통해 저급 언어로 변환된 코드
-
소스 코드(고급 언어) ➡ 컴파일러(컴파일) ➡ 목적 코드(저급 언어)
-
-
인터프리터 언어(interpreter language) : 인터프리터에 의해 소스 코드를 한 줄씩 저급 언어로 변환하여 실행하는 고급 언어
- 대표 언어 Python
- 인터프리터(interpreter) : 컴퓨터와 대화하듯 한 줄씩 실행
- N번째 줄에 문법 오류가 있어도 N-1번째까지는 올바르게 수행
- 한 줄씩 저급 언어로 해석하며 실행하기 때문에 컴파일 언어보다 느리다.
3. 목적 파일 vs 실행 파일
-
목적 파일 : 목적 코드로 이루어진 파일
-
실행 파일 : 실행 코드로 이루어진 파일 ➡ 윈도우의 .exe 확장자를 가진 파일
-
링킹 : 목적코드가 실행 파일이 되기 위해 거치는 작업
4. 확인 문제
-
고급 언어가 아닌 것 : 컴파일 언어, 인터프리트 언어
-
일반적으로 컴파일 언어보다 인터프리터 언어가 더 빠릅니다.
➡ 일반적으로 인터프리터 언어보다 컴파일 언어가 더 빠릅니다.
2. 명령어의 구조
1. 연산 코드와 오퍼랜드
-
명령어(instruction) : 연산 코드와 오퍼랜드로 구성
-
오퍼랜드(피연산자) : 연산에 사용할 데이터가 저장된 위치
-
오퍼랜드 필드(주소 필드) : 오퍼랜드가 담기는 영역
- 연산에 사용할 데이터를 직접 명시하기 보다는, 연산에 사용할 데이터가 저장된 위치(레지스터 이름)가 담긴다.
-
명령어 안에 하나도 없을 수도 있고, 한 개만 있을 수도 있고, 두 개 또는 세 개등 여러개 가능
-
0-주소 명령어 : 오퍼랜드가 하나도 없는 명령어
-
주소 명령어 : 오퍼랜드가 하나인 명령어 , 2-주소 명령어 : 두 개인 명령어, 3-주소 명령어 : 세 개인 명령어
-
-
-
연산 코드(연산자) : 명령어가 수행할 연산,
-
연산 코드 필드 : 연산 코드 필드
-
가장 기본적인 연산 코드 유형
-
데이터 전송
➡ MOVE : 데이터를 옮겨라
➡ STORE : 메모리에 저장하라
➡ LOAD(FETCH) : 메모리에서 CPU로 데이터를 가져와라
➡ PUSH : 스택에 데이터를 저장하라
➡ POP : 스택의 최상단 데이터를 가져와라
-
산술/논리 연산
➡ ADD / SUBTRACT / MULTIPLY / DIVIDE : 덧셈 / 뺼셈/ 곱셈/ 나눗셈을 수행하라
➡ INCREMENT / DECREMENT : 오퍼랜드에 1을 더하라 / 오퍼랜드에 1을 빼라
➡ AND / OR / NOT : AND / OR / NOT 연산을 수행하라
➡ COMPAREA : 두 개의 숫자 또는 TRUE / FALSE 값을 비교하라
-
제어 흐름 변경
➡ JUMP : 특정 주소로 실행 순서를 옮겨라
➡ CONDITIONAL JUMP : 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
➡ HALT : 프로그램의 실행을 멈춰라
➡ CALL : 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
➡ RETURN CALL : CALL을 호출할 때 저장했던 주소로 돌아가라
-
입출력 제어
➡ READ(INPUT) : 특정 입출력 장치로부터 데이터를 읽어라
➡ WRITE(OUTPUT) : 특정 입출력 장치로 데이터를 써라
➡ START IO : 입출력 장치를 시작하라
➡ TEST IO : 입출력 장치의 상태를 확인하라
-
-
2. 주소 지정 방식
-
오퍼랜드 필드에 메모리나 레지스터의 주소를 담는 이유 ➡ 명령어의 길이 때문이다.
ex) 명령어 1 = n비트, 연산 코드 필드 = m비트
-
1-주소 명령어
- 오퍼랜드 필드의 길이 = n-m비트
- 1-주소 명령어에서 표현할 수 있는 데이터 크기 : 2^12 = 4096
-
2-주소 명령어
- 2-주소 명령어에서 표현할 수 있는 데이터 크기 : 2^6 = 64
-
3-주소 명령어
- 3-주소 명령어에서 표현할 수 있는 데이터 크기 : 2^4 = 16
-
-
만약 오퍼랜드 필드 안에 메모리 주소가 담긴다면 표현할 수 있는 데이터의 크기는 하나의 메모리 주소에 저장할 수 있는 공간만큼 커진다.
Ex) 한 주소에 16비트를 저장할 수 있는 메모리가 있을 때
➡ 메모리 안에 데이터를 저장하고, 오퍼랜드 필드 안에 해당 메모리 주소를 명시
➡ 표현할 수 있는 정보의 가짓수 : 2^16
그림 1
Ex) 오퍼랜드 필드에 메모리 주소가 아닌 레지스터의 이름을 명시할 때
그림 2
-
유효주소(effective address) : 연산의 대상이 되는 데이터가 저장된 위치
- 그림1의 유효주소 : 10번지
- 그림2의 유효주소 : 레지스터 R1
-
주소 지정 방식(addressing mode): 연산에 사용할 데이터의 위치를 찾는 방법(유효 주소를 찾는 방법)
2-1. 대표적인 주소 지정 방식
-
즉시 주소 지정 방식(immediate addressing mode)
- 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식
-
장점
- 연산에 사용할 데이터를 메모리나 레지스터로부터 찾는 과정이 없어, 이하 설명할 주소 지정 방식들보다 빠르다.
-
단점
- 표현할 수 있는 데이터의 크기가 작아진다.
-
직접 주소 지정 방식(direct addressing mode)
- 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
-
장점
- 오퍼랜드 필드에서 표현할 수 있는 데이터의 크기는 즉시 주소 지정 방식보다 크다
-
단점
-
유효 주소를 표현할 수 있는 범위가 연산 코드의 비트 수만큼 줄어들었다.
➡ 표현할 수 있는 오퍼랜드 필드의 길이가 연산 코드의 길이만큼 짧아져 표현할 수 있는 유효 주소에 제한이 생길 수 있다.
-
-
간접 주소 지정 방식(indirect addressing mode)
- 유효 주소의 주소를 오퍼랜드 필드에 명시하는 방식
-
장점
- 직접 주소 지정 방식보다 표현할 수 있는 유효 주소의 범위가 더 넓어졌다.
-
단점
- 두 번의 메모리 접근이 필요하기 때문에 앞선 주소 지정 방식들보다 일반적으로 느리다.
-
레지스터 주소 지정 방식(register addressing mode)
- 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방식
-
직접 주소 지정 방식과 비슷하다.
-
일반적으로 CPU외부에 있는 메모리에 접근하는 것보다 CPU 내부에 있는 레지스터에 접근하는 것이 더 빠르다.
-
장점
- 직접 주소 지정 방식보다 빠르게 데이터에 접근할 수 있다.
-
단점
- 표현할 수 있는 레지스터 크기에 제한이 생길 수 있다.(직접 주소 지정 방식과 유사)
-
레지스터 간접 주소 지정 방식(register indirect addreseing mode)
- 연산에 사용할 데이터를 메모리에 저장하고 그 주소(유효 주소)를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방식
-
장점
-
유효 주소를 찾는 과정이 간접 주소 지정 방식과 비슷하지만, 메모리에 접근하는 횟수가 한 번으로 줄어든다.
-
간접 주소 지정 방식보다 빠르다.
-
-
정리
-
주소 지정 방식 : 연산에 사용할 데이터를 찾는 방법
-
유효 주소 : 연산에 사용할 데이터가 저장된 위치
-
대표적인 주소 저장 방식
-
즉시 주소 저장 방식 : 연산에 사용할 데이터
-
직접 주소 지정 방식 : 유효주소(메모리 주소)
-
간접 주소 지정 방식 : 유효 주소의 주소
-
레지스터 주소 지정 방식 : 유효 주소(레지스터 이름)
-
레지스터 간접 주소 지정 방식 : 유효 주소를 지정할 레지스터
-
-
3. 스택과 큐
- 스택
- LIFO: 후입선출 방식
- PUSH: 스택에 새로운 데이터를 저장하는 명령어
- POP: 스택에 저장된 데이터를 꺼내는 명령어
- 큐
- 양쪽이 뚫려 있는 저장 공간
- FIFO: 선입선출 방식
4. 확인 문제
-
명령어에 대한 설명이 틀린 것
-
연산 코드와 필드에는 메모리 주소만 담을 수 있습니다.
➡ 연산 코드와 필드에는 메모리 주소 이외에도 다양한 정보를 담을 수 있습니다.
-
-
메모리 5번지 속 100이라는 값을 CPU로 가져온다.
댓글남기기