컴퓨터가 받는 명령어

김떡만두·2023년 9월 5일

컴퓨터기초

목록 보기
4/5

printf("Hello World");

해당 코드를 컴퓨터가 바로 이해할 수 있을까?
위와 같은 코드는 고급언어라고 하고, 컴퓨터가 이해하는 언어는 저급언어라고 한다.

저급언어?

  • 기계어 : 0과 1로 이루어진 명령어
  • 어셈블리어 : 0과 1로 이루어진 기계어를 읽기 편한 형태로 번역한 저급언어.

고급언어?

  • C, C++, java 등

    오잉 그럼 고급언어를 대체 컴퓨터가 어떻게 받아드리는 거야?

컴퓨터가 고급언어를 받아드리는 방식

  • 컴파일 언어

    : 우리 프로그래밍 할 때, 흔히 '컴파일'한다 라는 말 많이 쓰잖아요? 그게 저급언어로 바꾸는 과정을 거친다! 라는 의미입니다.
  • 인터프리트 언어
    : 컴파일 방식은 모든 소스코드를 한 번에 번역하는 반면에, 인터프리트 방식은 코드를 한 줄씩 번역한다.

명령어의 구조?

더해라 / 메모리 32번지의 값과 / 값 120을

이처럼 명령어는

연산코드 / 오퍼랜드(주소필드)

로 구성이된다. 오퍼랜드는 값이 될 수도 있지만, 대부분 그 값의 주소가 많이 적히기 때문에 주소 필드라고도 말한다. 그리고 오퍼랜드는 없을 수도 있고, 여러개일 수도 있다.

대표적인 연산 코드의 종류

  • MOVE : 데이터를 옮겨라

  • STORE : 메모리에 저장해라

  • LOAD (FECTCH) : 메모리에서 CPU로 데이터를 가져와라

  • PUSH : 스택에 데이터를 저장해라

  • POP : 스택의 최상단 데이터를 가져와라

    😭 어.. 근데 스택이 뭔데요?

    스택

    : 스택은요! 아래 그림 처럼 아래가 막혀있는 자료구조입니다.

-한 쪽 끝이 막혀있는 메모리이기 때문에, 나중에 들어간 게 제일 먼저 나온다 ; Last In First Out 이라고도 합니다.
그래서 PUSH는 데이터를 밀어넣는 거구요. POP은 데이터를 저장 공간에서 팝🌟! 팝🌟! 빼내라는 연산 코드입니다.

📌 추가로 라는 자료구조도 많이 나와요!

: 양쪽 끝이 뚫려있는 자료구조입니다.

-5,4,3,2,1 순서로 메모리가 들어가고, 들어간 순서대로 메모리가 나온다. ; First in First Out

산술/논리 연산 코드

  • ADD/ SUBTRACT / MULTIPLY / DIVIDE : 덧셈 / 뺄셈 / 곱셈 / 나눗셈
  • INCREAMENT / DECREMENT : 오퍼랜드에 1 더하기 / 1 빼기
  • AND / OR / NOT
  • COMPARE : 두 개의 숫자 또는 T / F 값을 비교

제어 흐름 변경 코드

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

입출력 제어 코드

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

🙋🏻‍♀️ : 질문이요..! 근데 왜 명령어를 입력할 때 연산코드 / 데이터주소 로 작성하는 거예요? 데이터 그대로 쓰면 안되낭?

-명령어는 16비트의 크기이기 때문에, 데이터를 입력하게 되면 명령어를 작성하는 데에 한계가 있다. 그러므로 주소를 직접 적어서, 더 큰 데이터를 그리고 많은 데이터를 입력할 수 있게 한다.
그리고 이때 사용하는 주소유효주소라고 한다.


😵‍💫사실 나는 해당 부분에서 살짝 헤맸다.
컴공과 학생으로서 멍청한 소리이긴 한데. 명령어가 16비트밖에 안 된다는 게 뭔말일까?
여기서 말하는 명령어는 컴퓨터 내에서 CPU에게 내리는 명령이다. 컴퓨터는 계산기라는 걸 잊지 말자. 계산하는 애가 16비트 컴퓨터고, 우리는 그에 맞춰 16비트명령어를 보내줘야 한다.


명령어 주소 지정방식

  • 연산에 사용할 데이터가 저장된 위치를 찾는 방법
  • 유효주소를 찾는 방법

즉시 주소 지정 방식 (immediate addressing mode)

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

직접 주소 지정 방식 (direct addressing mode)

  • 오퍼랜드 필드에 유효 주소 직접적으로 명시
  • 유효 주소를 표현할 수 있는 크기가 연산 코드만큼 줄어듦

간접 주소 지정 방식 (indirect addressing mode)

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

레지스터 주소 지정 방식 (register addressing mode)

  • 연산에 사용할 데이터가 저장된 레지스터 명시
  • 메모리에 접근하는 속도보다 레지스터에 접근하는 것이 빠름

레지스터 간접 주소 지정 방식 (register indirect addressing mode)

  • 연산에 사용할 데이터를 메모리에 저장
  • 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시

PLUS❗ 소스코드가 명령어가 되기까지
전처리기컴파일러어셈블러링커 의 과정을 거친다.

전처리기 (preprocessor)

  • 외부에 선언된 다양한 소스코드, 라이브러리 포함 ( #include ...)
  • 프로그래밍의 편의를 위해 작성된 매크로 변환 ( #define ...)
  • 컴파일할 영역 명시 ( #if, #ifdef ...)
    - 아 그니까 쉽게! #include <stdio.h> 라이브러리를 싹~ 긁어온다고 생각하면 편해요!

컴파일러 (compiler)

  • 전처리가 완료되어도 여전히 소스코드임~
  • 전처리 완료된 소스 코드를 저급 언어(어셈블리 언어)로 변환

어셈블러 (assembler)

  • 어셈블리어를 기계어로 변환
  • 목적코드(0과 1로 이루어짐)를 포함하는 목적 파일이 됨

링커 (linker)

  • 어셈블러를 통해 만들어진 목적파일들을 이어주는 역할을 함.
  • 최종적으로 실행파일을 만듦

🤓웅? 목적파일과 실행파일이 뭐가 다르냐구?
목적파일 main.o, helper.o가 있다고 치자.

목적파일 main에는 helper파일이 있어야 실행 가능한데, 단독적으로 실행하면 어떤 연산도 할 수 없잖아?

그래서 링킹을 통해, 두 파일을 연결한 실행파일을 만들어 내는 거지!!

📝참고 강의
profile
학교 과제용 블로그

0개의 댓글