-고급언어와 저급언어
사람을 위한 언어를 고급 언어라고 합니다. 여러분이 알고 있는 대부분의 프로그래밍 언어가 고급 언어에 속합니다. 컴퓨터가 직접 이해하고 실행할 수 있는 언어를 저급 언어라고 합니다.
저급 언어에는 두 가지 종류가 있습니다. 바로 기계어와 어셈블리어입니다.
기계어란 0과 1의 명령어 비트로 이루어진 언어입니다. 이진수로 나열하면 너무 길어지기 때문에 가독성을 위해 십육진수로 표현하기도 합니다. 0과 1로 표현된 기계어를 읽기 편한 형태로 번역한 언어가 어셈블리어입니다.
-컴파일 언어와 인터프리터 언어 (고급언어 → 저급언어)
컴파일 언어는 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어입니다. (ex. C)
코드 전체가 저급 언어로 변환되는 과정을 컴파일이라고 합니다. 컴파일을 수행해 주는 도구를 컴파일러라고 합니다. 소스 코드 내에서 오류를 하나라도 발견하면 해당 소스 코드는 컴파일에 실패합니다. 컴파일러를 통해 저급 언어로 변환된 코드를 목적 코드라고 합니다.
인터프리터 언어는 인터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급 언어입니다. (ex. Python)
소스 코드를 한 줄씩 한 줄씩 차례로 실행합니다. 실행해 주는 도구를 인터프리터라고 합니다. N번째 줄에 문법 오류가 있더라도 N-1번째 줄까지는 올바르게 수행합니다. 일반적으로 인터프리터 언어는 컴파일 언어보다 느립니다.
-연산 코드와 오퍼랜드
연산 코드(연산자)**는 명령어가 수행할 연산이고 **오퍼랜드(피연산자)**는 연산에 사용될 데이터 또는 데이터가 저장된 위치이다.
오퍼랜드 필드에는 숫자나 문자와 같이 연산에 사용할 데이터를 직접 명시하기보다는 많은 경우 연산에 사용할 데이터가 저장된 위치, 즉 메모리 주소나 레지스터 이름이 담깁니다. 그래서 오퍼랜드 필드를 주소 필드라고 부르기도 하죠. 여기서 오퍼랜드가 하나도 없는 명령어를 O-주소 명령어라고 하고, 하나인 명령어를 1-주소 명령어, 두 개인 명령어를 2-주소 명령어, 세 개인 명령어를 3-주소 명령어라고 합니다.
연산 코드 종류는 매우 많지만, 가장 기본적인 연산 코드는 4가지 유형이 있습니다.
1. 데이터 전송
-MOVE : 데이터를 옮겨라
-STORE : 메모리에 저장하라
-LOAD(FETCH) : 메모리에서 CPU로 데이터를 가져와라
-PUSH : 스택에 데이터를 저장하라
-POP : 스택의 최상단 데이터를 가져와라
2. 산술/논리 연산
-ADD/SUBTRACT/MULTIPLY/DIVIDE : 덧셈/뺄셈/곱셈/나눗셈을 수행하라
-INCREMENT/DECREMENT : 오퍼랜드에 1을 더하라/1을 빼라
-AND/OR/NOT : AND/OR/NOT 연산을 수행하라
-COMPARE : 두 개의 숫자 또는 TRUE/FALSE 값을 비교해라
3. 제어 흐름 변경
-JUMP : 특정 주소로 실행 순서를 옮겨라
-CONDITIONAL JUMP : 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
-HALT : 프로그램의 실행을 멈춰라
-CALL : 되돌아올 주소를 저장한 채 특정 주소로 실행 주소를 옮겨라
-RETURN : CALL을 호출할 때 저장했던 주소로 돌아가라
4. 입출력 제어
-READ(INPUT) : 특정 입출력 장치로부터 데이터를 읽어라
-WRITE(OUTPUT) : 특정 입출력 장치로 데이터를 써라
-START IO : 입출력 장치를 시작하라
-TEST IO : 입출력 장치의 상태를 확인하라
-주소 지정 방식 연산 코드에 사용할 데이터가 저장된 위치, 연산의 대상이 되는 데이터가 저장된 위치를 유효 주소라고 합니다. 오퍼랜드 필드에 데이터가 저장된 위치를 명시할 때 사용할 데이터 위치를 찾는 방법을 주소 지정 방식이라고 합니다.
즉시 주소 지정 방식은 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식입니다. 가장 간단한 형탱의 주소 지정 방식이며, 다른 주소 지정 방식들보다 빠릅니다. 직접 주소 지정 방식은 오퍼랜드 필드에 유효 장소를 직접적으로 명시하는 방식입니다. 표현할 수 있는 오퍼랜드 필드의 길이가 연산 코드의 길이만큼 짧아져 표현할 수 있는 유효 주소에 제한이 생길 수 있습니다. 간접 주소 지정 방식은 유효 주소의 주소를 오퍼랜드 필드에 명시합니다. 표현할 수 있는 유효 주소의 범위가 더 넓어지지만 두 번의 메모리 접근이 필요하기 때문에 앞서 설명한 주소 지정 방식들보다 느린 방식입니다. 레지스터 주소 지정 방식은 주소 지정 방식과 비슷하게 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방법입니다. CPU 외부에 있는 메모리에 접근하는 것보다 내부에 있는 레지스터에 접근하는 것이 더 빠릅니다. 레지스터 주소 지정 방식은 직접 주소 지정 방식과 비슷한 문제를 공유합니다. 표현할 수 있는 레지스터 크기에 제한이 생길 수 있다는 점입니다. 레지스터 간접 주소 지정 방식은 연산에 사용할 데이터를 메모리에 저장하고, 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방법입니다. 간접 주소 지정 방식과 비슷하지만, 메모리에 접근하는 횟수가 한 번응로 줄어든다는 차이이자 장점이 있습니다.
+스택과 큐
스택이란 한쪽 끝이 막혀 있는 통과 같은 저장 공간입니다. 한쪽 끝이 막혀 있어서 막혀있지 않은 쪽으로 데이터를 차곡차곡 저장하고, 자료를 빼낼 때는 마지막으로 저장한 데이터부터 빼냅니다. 후입선출이라는 점에서 LIFO 자료구조 라고도 부릅니다. 이때 스택에 새로운 데이터를 저장하는 명령어가 PUSH, 데이터를 꺼내는 명령어가 POP입니다.
양쪽이 뚫려있는 통과 같은 저장 공간을 큐라고 합니다. 큐는 한쪽으로는 데이터를 저장하고 다른 한쪽으로는 먼저 저장한 순서대로 데이터를 빼닙니다. 선입선출이라는 점에서 FIFO 자료 구조라고도 부릅니다.
출처 : 혼자 공부하는 컴퓨터구조 + 운영체제
'공부 > CSOS' 카테고리의 다른 글
메모리와 캐시 메모리 (0) | 2023.02.12 |
---|---|
CPU 성능 향상 기법 (0) | 2023.02.03 |
CPU의 작동 원리 (0) | 2023.01.22 |
데이터 (0) | 2023.01.01 |
컴퓨터 구조 시작하기 (0) | 2023.01.01 |