CS지식
[혼공학습단 10기 - 컴퓨터 구조 + 운영체제] 1주차 / Chapter 03. 명령어
Damgome
2023. 7. 9. 19:45
Chapter 03. 명령어
03-1. 소스 코드와 명령어
프로그래밍 언어는 고급 언어, 저급 언어로 나뉨
- 고급 언어 : 대부분의 프로그래밍 언어(C, C++, Java, Python 등)
- 저급 언어 : 컴퓨터가 직접 이해하고 실행 가능한 언어
- 기계어(machine code) : 0/1의 명령어 비트로 이루어진 언어, only for 컴퓨터
- 어셈블리어(assembly language) : 기계어를 사람이 읽기 편한 형태로 번역한 언어, but 여전히 사람이 읽고 쓰기 편하지는 않다! ⇒ 임베디드/게임/정보보안 분야 개발자가 많이 이용
고급 언어가 저급 언어로 변환되는 방식
- 컴파일 방식 → 컴파일 방식으로 작동되는 프로그래밍 언어 : 컴파일 언어
- 인터프리트 방식 → 인터프리트 방식으로 작동되는 프로그래밍 언어 : 인터프리터 언어
1. 컴파일 언어
컴파일러에 의해 소스 코드 전체가 저급 언어로 변환, 실행되는 고급 언어 (ex) C언어
- 변환되는 과정 == 컴파일(compile)
- 컴파일 해주는 도구 == 컴파일러(compiler)
- 컴파일러는 소스코드 처음부터 끝까지 컴파일 하고, 그 와중에 오류가 발견되면 컴파일 실패! (소스코드 전체가 실행되지 않음)
- 컴파일 완료된 저급 언어로 변환된 코드 == 목적 코드(object code)
2. 인터프리터 언어
인터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급 언어 (ex) 파이썬
- 인터프리터(interpreter) == 소스 코드를 한 줄씩 저급 언어로 변환, 실행해 주는 도구
- 한 줄 단위로 실행 ⇒ N번째 줄에 오류 있어도 N-1번째 줄까지 올바르게 수행됨
- 컴파일 언어보다 느림
목적 파일과 실행 파일
목적 코드로 이루어진 파일이 목적 파일, 실행 코드로 이루어진 파일이 실행 파일
링킹 : 목적 코드(소스 코드를 컴파일 하여 저급 언어로 변환된 코드) ⇒ 실행 파일
확인문제1.
3,4
확인문제2.
2
03-2. 명령어의 구조
명령어
- 연산 코드(operation code) : 명령어가 수행할 연산 (연산자)
- 오퍼랜드(operand) : 연산에 사용할 데이터 or 연산에 사용할 데이터의 위치 (피연산자)
오퍼랜드
- 숫자, 문자 등을 나타내는 데이터 or 메모리/레지스터 주소
- 거의 데이터의 저장된 위치, 메모리 주소/레지스터 이름 등이 담김 → 오퍼랜드 필드 == 주소 필드
- 오퍼랜드 수에 따른 명령어 구분
- 0-주소 명령어 : 오퍼랜드가 하나도 없는 명령어
- 1-주소 명령어 : 오퍼랜드 하나인 명령어
- 2-주소 명령어 : 오퍼랜드 두 개인 명령어
- 3-주소 명령어 : 오퍼랜드 세 개인 명령어
연산 코드
- 가장 기본적인 연산 코드 유형
- 데이터 전송
- MOVE : 데이터 옮겨라
- STORE : 메모리에 저장해라
- LOAD(FETCH) : 메모리에서 CPU로 데이터를 가져와라
- PUSH : 스택에 데이터를 저장해라
- POP : 스택의 최상단 데이터를 가져와라
- 산술/논리 연산
- ADD / SUBTRACT / MULTIPLY / DIVIDE : 덧셈 / 뺄셈 / 곱셈 / 나눗셈 수행하라
- INCREMENT / DECREMENT : 오퍼랜드에 1 더해라 / 오퍼랜드에 1 빼라
- AND / OR / NOT : 해당 연산을 수행하라
- COMPARE : 두 숫자 또는 TRUE/FALSE 값 비교하라
- 제어 흐름 변경
- JUMP : 특정 주소로 실행 순서 옮겨라
- CONDITIONAL JUMP : 조건에 부합 시 특정 주소로 실행 순서 옮겨라
- HALT : 프로그램 실행 멈춰라
- CALL : 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
- RETURN : CALL 호출할 때 저장했던 주소로 돌아가라
- 입출력 제어
- READ(INPUT) : 특정 입출력 장치로부터 데이터 읽어라
- WRITE(OUTPUT) : 특정 입출력 장치로 데이터 써라
- START IO : 입출력 장치 시작해라
- TEST IO : 입출력 장치 상태 체크해라
- 데이터 전송
유효 주소(effective address)
연산 코드에 사용할 데이터가 저장된 위치, 연산의 대상이 되는 데이터가 저장된 위치
주소 지정 방식(addressing mode)
연산에 사용할 데이터 위치를 찾는 방법
- 즉시 주소 지정 방식
- 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식
- 직접 주소 지정 방식
- 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
- 간접 주소 지정 방식
- 유효 주소의 주소를 오퍼랜드 필드에 명시
- 레지스터 주소 지정 방식
- 직접 주소 지정 방식과 비슷하게 연산에 사용될 데이터를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방법
- 레지스터 간접 주소 지정 방식
- 연산에 사용할 데이터를 메모리에 저장하고, 그 주소(유효 주소)를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방법
스택과 큐
스택 : 한쪽 끝이 막혀 있는 통과 같은 저장 공간
→ 데이터를 차곡차곡 저장하고, 데이터를 빼낼 때는 마지막으로 저장한 데이터부터 뺌(후입선출, LIFO 자료 구조)
- PUSH : 스택에 새로운 데이터를 저장하는 명령어
- POP : 스택에 저장된 데이터를 꺼내는 명령어
큐 : 양쪽이 뚫려 있는 통과 같은 저장 공간
→ 한쪽으로는 데이터 저장하고, 다른 한쪽으로 데이터 빼냄. 즉, 가장 먼저 저장된 데이터부터 뺌(선입선출, FIFO 자료 구조)
마무리
확인문제1 / 2
확인문제2 / 6, 200