컴퓨터 구조 + 운영체제 #03

박영무·2024년 10월 30일
post-thumbnail

참고 서적: 혼자 공부하는 컴퓨터 구조 + 운영체제 (강민철, 한빛미디어)


I. 소스 코드와 명령어

1. 고급 언어와 저급 언어

1) 저급 언어

  • 컴퓨터가 이해하고 실행하기 편하게 만들어진 언어이다.
  • 구분
    i) 기계어
	- 0과 1로 이루어진 명령어로 구성된 저급 언어이다.
	- 예: 0101 0101

  ii) 어셈블리어

	- 0과 1로 이루어진 기계어를 읽기 편한 형태로 번역한 저급 언어이다.
	- 예: push rbp

2) 고급 언어

  • 개발자가 읽고 쓰기 편하게 만들어진 언어이다.
  • 컴퓨터 내부에서 실행될 때는 저급 언어로 변환되어야 한다.
  • 구분
    i) 컴파일 언어
	- 컴파일 언어로 작성된 소스 코드는 컴파일러에 의해 저급 언어로 변환횐다.
	- 이 변환 과정을 컴파일이라고 하며, 변환 결과로 만들어진 저급 언어 코드를 목적 코드라고 한다.
	- 소스 코드 컴파일 중 오류가 발생하면 소스 코드 전체가 실행되지 않는다.

  ii) 인터프리트 언어

	- 소스 코드가 인터프리터에 의해 한 줄씩 저급 언어로 변환되어 실행된다.
	- 소스 코드 인터프리트 중 오류가 발생하면 오류 발생 전까지의 코드는 실행된다.

3) C 언어의 컴파일 과정

i) 전처리기 (Preprocessor)

	- 전처리 과정: 컴파일하기 전에 #include, #define, #if 등을 처리한다.
	- 예: test.c -> 전처리기 -> test.i

  ii) 컴파일러 (Compiler)

	- 컴파일 과정: 전처리된 소스 코드를 저급 언어인 어셈블리 언어로 변환한다.
	- 예: test.i -> 컴파일러 -> test.s

  iii) 어셈블러 (Assembler)

	- 어셈블 과정: 어셈블리 언어를 기계어로 변환하여 목적 코드 (Object File)를 포함한 목적 파일로 만든다.
	- 목적 파일: 목적 파일은 링킹 (Linking)을 거쳐야만 실행 파일로 된다.
	- 예: test.s -> 어셈블러 -> test.o

  iv) 링커 (Linker)

	- 링킹 과정: 여러 목적 파일을 하나의 실행 파일로 묶어주는 작업이다.
	- 예: test.o -> 어셈블러 -> test.exe

II. 명령어의 구조와 주소 지정 방식

1. 명령어의 구조

  • 명령어는 Operand와 Operation Code로구성된다.

1) Operand

  • 연산에 사용될 데이터 혹은 연산에 사용될 데이터가 저장되는 위치이다.
  • 주소 필드: 연산에 사용될 데이터가 저장되는 위치가 연산에 사용될 데이터보다 훨씬 자주 저장되므로 Operand를 주소 필드라고도 한다.
  • 명령어에는 Operand의 개수가 0일 수도, 1 이상일 수도 있다.

2) Operation Code

  • 명령어가 수행할 연산이다.
  • 연산 코드가 담고 있는 내용
    i) 데이터 전송 코드
	- MOVE: 어떤 Register에서 다른 Register로 데이터를 옮겨라.
	- STORE: 메모리에 데이터를 저장하라.
	- LOAD (FETCH): 메모리에서 CPU로 데이터를 가져와라.
	- PUSH: 스택에 데이터를 저장하라.
	- POP: 스택 최상단 데이터를 가져와라.

  ii) 산술/논리 연산 코드

	- ADD / SUBTRACT / MULTIPLY / DIVIDE: 덧셈 / 뺄셈 / 곱셈 / 나눗셈을 수행하라.
	- INCREMENT / DECREMENT: Operand에 1을 더하라. / Operand에 1을 빼라.
	- AND / OR / NOT: AND / OR / NOT 연산을 수행하라.
	- COMPARE: 두 개의 숫자 또는 TRUE / FALSE 값을 비교하라.

  iii) 제어 흐름 변경 코드

	- JUMP: 특정 주소로 실행 순서를 옮겨라.
	- CONDITIONAL JUMP: 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라.
	- HALT: 프로세스의 실행을 멈춰라.
	- CALL: 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라.
	- RETURN: CALL 호출 시 저장됐던 주소로 돌아가라.

  iv) 입출력 제어

	- READ (INPUT): 특정 입출력 장치로부터 데이터를 읽어라.
	- WRITE (OUTPUT): 특정 입출력 장치로 데이터를 써라.
	- START IO: 입출력 장치를 시작하라.
	- TEST IO: 입출력 장치의 상태를 확인하라.

2. 명령어 주소 지정 방식

1) 유효 주소 (Effective Address)

  • 연산에 사용할 데이터가 저장되는 위치

2) 명령어 주소 지정 방식 (Addressing Mode)

  • 유효 주소를 찾는 방법
  • 종류
    i) 즉시 주소 지정 방식 (Immediate Addressing Mode)
	- 연산에 사용될 데이터를 Operand 필드에 직접 명시하는 방식
	- 가장 간단한 형태의 주소 지정 방식이다.
	- 연산에 사용할 데이터의 크기가 작아질 수 있지만 
	  연산에 사용될 데이터를 찾기 위해 Memory나 Register를 거치지 않기 때문에 CPU의 속도는 빠르다.

  ii) 직접 주소 지정 방식 (Direct Addressing Mode)

	- Operand 필드에 유효 주소를 직접 명시하는 방식
	- 유효 주소를 표현할 수 있는 크기가 Operation Code만큼 줄어든다.

  iii) 간접 주소 지정 방식 (Indirect Addressing Mode)

	- Operand 필드에 유효 주소의 주소를 명시하는 방식
	- 앞선 주소 지정 방식들에 비해 CPU의 속도가 느리다.

3) 레지스터 주소 지정 방식 (Register Addressing Mode)

  • 연산에 사용할 데이터가 저장된 Register를 명시하는 방식
  • CPU가 Memory에 접근하는 속도보다 Register에 접근하는 속도가 더 높다.
profile
시행착오는 성장의 밑거름입니다.

0개의 댓글