게으른 나에게

[혼자 공부하는 컴퓨터구조+운영체제] "chapter3. 명령어" 본문

My Study/서적 공부

[혼자 공부하는 컴퓨터구조+운영체제] "chapter3. 명령어"

handbefore 2024. 7. 30. 00:01

3-1 소스 코드와 명령어

명령어는 컴퓨터를 실질적으로 작동시키는 매우 중요한 정보!

모든 소스 코드는 컴퓨터 내부에서 명령어로 변환.

 

고급 언어와 저급 언어

고급언어: 사람이 이해하고 작성하기 쉽게 만들어진 언어. 대부분의 프로그래밍 언어.

저급언어: 컴퓨터가 직접 이해하고 실행할 수 있는 언어.

고급언어로 작성된 소스 코드가 실행되려면 반드시 저급언어, 명령어로 변환되어야 함.

 

저급언어

1. 기계어: 0과 1의 명령어 비트로 이루어진 명령어 모음.

 

2. 어셈블리어: 0과 1로 표현된 명령어(기계어)를 읽기 편한 형태로 번역한 언어.

   -하드웨어와 밀접하게 맞닿아 있는 프로그램을 개발하는 임베디드 개발자, 게임 개발자, 정보 보안 분야 등의 개발자 많이 이용.

   -어셈블리어를 읽으면 컴퓨터가 프로그램을 어떤 과정으로 실행하는지, 프로그램이 어떤 절차로 작동하는지를 가장 근본적인 단계에서 하나하나 추적하고 관찰할 수 있음.

 

고급언어

1. 컴파일 언어:  컴파일러에 의해 소스코드 전체가 저급언어로 변환되어 실행되는 고급언어. (c언어)

   -컴파일: 코드 전체가 저급언어로 변환되는 과정.

   -컴파일러: 컴파일을 수행해 주는 도구. 소스 코드에 문법적인 오류가 있는지, 실행가능한 코드인지, 실행하는 데 불필요한 코드는 없는지 등을 따지며 소스 코드를 처음부터 끝까지 저급언어로 컴파일. 컴파일이 성공적으로 수행되면 저급언어로 변환. 

   -목적코드: 컴파일러를 통해 저급언어로 변환된 코드.

 

2. 인터프리터 언어: 인터프리터에 의해 소스 코드가 한줄씩 실행되는 고급언어.(python)

   -인터프리터: 소스 코드를 한 줄씩 저급언어로 변환하여 실행해주는 도구.

 

고급언어 종류 컴파일 언어 인터프리터 언어
차이점 개발자가 작성한 소스 코드 전체를 쭉 훑어보며 소스 코드에 소스 코드를 처음부터 끝까지 저급언어로 컴파일. 소스 코드를 한 줄씩 한 줄씩 차례로 실행.
컴파일러가 소스 코드 내에서 오류를 하나라도 발견하면 해당 소스 코드는 컴파일 실패. 소스 코드를 한 줄씩 실행하기 때문에 소스 코드 N번째 줄에 문법 오류가 있더라도 N-1번째 줄까지는 올바르게 수행.

 

 

목적파일 vs 실행파일

-목적파일: 목적 코드로 이루어진 파일

-실행파일: 실행 코드로 이루어진 파일

-링킹: 목적코드가 실행파일이 되기 위해서 거치는 연결 작업.

 

 

 


 

3-2 명령어의 구조

 

연산코드와 오퍼랜드

명령어는 '무엇을 대상으로, 어떤 작동을 수행하라'는 구조로 되어 있음.

 

명령어 구조

명령어: 연산코드와 오퍼랜드로 구성

연산코드 (=연산자): 색 배경 필드값, '명령어가 수행할 연산'

오퍼랜드 (= 피연산자): 흰색 배경 필드 값, '연산에 사용할 데이터', '연산에 사용할 데이터가 저장된 위치'

 

하나의 명령어

연산코드 필드: 색칠된 부분, 연산코드가 담기는 영역.

오퍼랜드 필드 (=주소필드): 색칠되지 않은 부분, 오퍼랜드가 담기는 영역. 숫자와 문자 등을 나타내는 데이터 또는 메모리나 레지스터 주소가 올 수 있음.

 

 

연산코드: 붉은 글씨

검은글씨: 오퍼랜드

 

오퍼랜드

오퍼랜드는 명령어 안에 하나도 없을 수 있고, 한개, 두개, 세개 등 있을 수 있음.

0-주소 명령어: 오퍼랜드가 하나도 없는 명령어.

1-주소 명령어: 오퍼랜드가 하나인 명령어.

2-주소 명령어: 오퍼랜드가 두개인 명령어.

 

연산코드

연산코드 유형:

1. 데이터 전송

2. 산술/논리 연산

3. 제어 흐름 변경

4. 입출력 제어

 

명령어의 종류와 생김새는 CPU마다 다르기 때문에 연산 코드의 종류와 생김새 또한 다름.

 

유효주소: 연산 코드에 사용할 데이터가 저장된 위치, 연산의 대상이 되는 데이터가 저장된 위치.

 

주소 지정 방식

명령어 길이 때문에 오퍼랜드 필드에 메모리나 레지스터의 주소를 담음.

오퍼랜드 필드에 데이터가 저장된 위치를 명시할 때 연산에 사용할 데이터 위치를 찾는 방법. 유효 주소를 찾는 방법.

 

현대 CPU의 다양한 주소 지정 방식.

1. 즉시 주소 지정 방식: 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시. 가장 간단한 형태의 주소 지정 방식.  연산에 사용할 데이터의 크기가 작아질 수 있지만, 빠름.

2. 직접 주소 지정 방식: 오퍼랜드 필드에 유효 주소(메모리 주소) 직접적으로 명시, 유효 주소를 표현할 수 있는 크기가 연산 코드만큼 줄어듦

3. 간접주소 지정 방식: 오퍼랜드 필드에 유효 주소의 주소를 명시,  앞선 주소 지정 방식들에 비해 속도가 느림

4. 레지스터 주소 지정 방식: 연산에 사용할 데이터가 저장된 (유효주소 = 레지스터 이름)레지스터 명시, 메모리에 접근하는 속도보다 레지스터에 접근하는 것이 빠름

5. 레지스터 간접 주소 지정 방식: 연산에 사용할 데이터를 메모리에 저장, 그 유효주소를 저장한 레지스터를 오퍼랜드 필드에 명시

 

 

 

스택과 큐

스택

 -한쪽 끝이 막혀 있는 통과 같은 저장 공간.

 -나중에 저장한 데이터를 가장 먼저 빼내는 데이터 관리 방식 (후입선출) (LIFO)

 -POP: 스택에 새로운 데이터를 저장하는 명령어

 -PUSH: 스택에 저장된 데이터를 꺼내는 명령어

 

 -양쪽이 뚫려 있는 통과 같은 저장공간

 -가장 먼저 저장된 데이터부터 빼내는 데이터 관리 방식 (선입선출) (FIFO)

 

 

 


출처

https://hongong.hanbit.co.kr/%ec%bb%b4%ed%93%a8%ed%84%b0-%ea%b5%ac%ec%a1%b0-%ec%9a%b4%ec%98%81%ec%b2%b4%ec%a0%9c/

 

[한빛미디어] 혼자 공부하는 컴퓨터 구조+운영체제

좋은 개발자는 컴퓨터를 분석의 대상으로 바라볼 뿐, 두려워하지 않는다!‘전공서가 너무 어려워서 쉽게 배우고 싶을 때’, ‘개발자가 되고 싶은데 뭐부터 봐야 하는지 모를 때’ ‘기술 면접

hongong.hanbit.co.kr