본 내용은 혼자 공부하는 컴퓨터 구조 + 운영체제 책을 공부하며 정리한 내용입니다.
https://www.yes24.com/Product/Goods/111378840
1. 소스 코드와 명령어
우리는 C, Java, Python과 같은 프로그래밍 언어로 만든 소스 코드를 실행시킨다.
모든 소스 코드는 컴퓨터 내부에서 명령어로 변환된다.
고급 언어와 저급 언어
프로그래밍 언어란 컴퓨터가 이해하는 언어가 아닌 사람이 이해하고 작성하기 쉽게 만들어진 언어
고급 언어: 사람을 위한 언어
저급 언어: 컴퓨터가 직접 이해하고 실행할 수 있는 언어
저급 언어의 종류
- 기계어: 0과 1의 명령어 비트로 이루어진 언어
기계어는 오로지 컴퓨터만을 위해 만들어진 언어
- 어셈블리어
기계어를 읽을 수 있게 번역한 언어
세탁기, 전자레인지 등등 임베디드 개발에는 어셈블리 언어가 사용됨
고급언어로 소스 코드를 작성하면 자동으로 저급 언어로 변환되어 잘 실행되는데, 굳이 저급 언어를 알아야 할까요?
하드웨어와 밀접하게 맞닿아 있는 임베디드 개발자, 게임 개발자 등의 개발자들은 어셈블리어 이용합니다.
컴파일 언어와 인터프리터 언어
고급 언어가 저급 언어로 변환하는 방식에는 2가지 방식 있습니다.
컴파일 언어
컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어입니다.
대표 언어: C
컴파일: 컴파일 언어로 작성된 소스 코드는 코드 전체가 저급 언어로 변환되는 과정
컴파일러: 컴파일을 수행하는 도구
문법적인 오류, 실행 가능 유무를 소스 코드 전체를 훑어보며, 하나라도 발견되면 컴파일 실패합니다.
인터프리터 언어
인터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급 언어입니다.
인터프리터: 소스 코드를 한 줄씩 저급 언어로 변환하여 실행해 주는 도구
※ 현대의 많은 프로그래밍 언어 중에는 컴파일 언어와 인터프리터 언어 간의 경계가 모호한 경우가 많습니다.
가령 인터프리터 언어의 대표적인 Python도 컴파일을 하며, Java 같은 경우에도 컴파일과 인터프리트를 동시에 수행합니다.
칼로 자르듯 구분하기 보다, '두 가지 방식이 있다' 정도로 이해하면 좋을 것 같습니다.
일반적으로 컴파일 언어가 인터프리터 언어보다 빠릅니다.
인터프리터 언어는 소스 코드 마지막까지 한 줄씩 저급 언어로 해석하면서 실행해야 하기 때문입니다.
2. 명령어의 구조
연산 코드와 오퍼랜드
"무엇을 해라!"
명령어는 다음과 같이 대상과 수행 작업로 이루어져있다.
오퍼랜드: 대상
연산 코드: 수행 작업
오퍼랜드
연산에 사용할 데이터 또는 연산에 사용할 데이터가 저장된 위치
연산에 사용할 데이터, 데이터가 저장된 메모리 주소, 데이터가 저장된 레지스터 이름이 담깁니다.
주소 필드라고 부르기도 합니다.
다음과 같이 오퍼랜드의 개수로 분류가 되기도 합니다.
연산 코드
크게 네 가지 방식이 있습니다. CPU가 공통으로 이해하는 연산 코드의 예시입니다.
- 데이터 전송
MOVE: 데이터 옮겨라
STORE: 데이터 저장해라
LOAD: 데이터 가져와라
PUSH: 스택에 데이터 넣어라
POP: 스택에서 데이터 가져와라
- 산술/논리 연산
ADD / SUBTRACT / MULTIPLY / DIVIDE: 더하고 빼고 곱하고 나눠라
INCREMENT / DECREMENT: 오퍼랜드에 1을 더하고 빼라
ADD / OR / NOT
COMPARE: 숫자 비교 또는 참/거짓 값 비교해라
- 제어 흐름 변경
JUMP: 특정 주소로 실행 순서를 옮겨라
CONDITIONAL JUMP: 특정 조건에서만 특정 주소로 실행 순서를 옮겨라
HALT: 실행을 멈춰라
CALL: 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
RETURN: 저장했던 주소로 돌아가라
- 입출력 제어
READ: 특정 입출력 장치로부터 데이터를 읽어라
WRITE: 특정 입출력 장치로부터 데이터를 써라
START IO: 입출력 장치 시작해라
TEST IO: 입출력 장치 상태 확인해라
주소 지정 방식
오퍼랜드에는 데이터의 값을 직접 넣는 방식도 있지만 주로 데이터의 주소를 담습니다.
왜 굳이 주소를 담는 걸까요?
명령어의 길이가 한정적이기 때문입니다.
오퍼랜드 필드 안에 메모리 주소가 담긴다면, 데이터의 크기는 하나의 메모리 주소에 저장할 수 있는 공간만큼 커집니다.
※ 유효 주소: 연산의 대상이 되는 데이터가 저장된 위치
따라서 주소 지정 방식이란, 유효 주소를 찾는 방식입니다.
즉시 주소 지정 방식
연산에 사용할 데이터를 직접 오퍼랜드 필드에 명시
가장 간단한 형태의 주소 지정 방식
데이터의 크기가 작아지지만, 메모리나 레지스터를 찾지 않아도 되기 때문에 빠릅니다.
직접 주소 지정 방식
오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
여전히 유효 주소를 표현할 수 있는 범위가 연산 코드의 비트 수만큼 줄어들어서 유효 주소에 제한이 생길 수 있습니다.
간접 주소 지정 방식
유효 주소의 주소를 오퍼랜드의 필드에 명시
유효 주소의 범위가 더 넓어졌지만, 두 번의 메모리 접근으로 앞선 두 방식들보다 느립니다.
레지스터 주소 지정 방식
데이터를 저장한 메모리 주소가 아닌 레지스터 이름을 오퍼랜드의 필드에 명시
일반적으로 CPU 외부에 있는 메모리보다, CPU 내부에 있는 레지스터에 접근하는 것이 더 빠릅니다.
레지스터 간접 주소 지정 방식
연산에 사용할 데이터를 메모리에 저장하고, 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시
간접 주소 지정 방식과 비슷하지만, 메모리에 접근하는 횟수가 한 번으로 줄어듭니다.
'Computer Architecture' 카테고리의 다른 글
[혼공컴운] Chapter2. 데이터 (1) | 2024.08.20 |
---|---|
[혼공컴운] Chapter1. 컴퓨터 구조 시작하기 (0) | 2024.08.04 |