공부/컴퓨터구조

[ 컴퓨터구조 ] 명령어

haena02 2023. 1. 17. 16:46
반응형

1. 소스 코드와 명령어

 

우리가 작성하는 소스코드는 컴퓨터 내부에서 명령어로 변환되어 컴퓨터를 작동시킨다. 

 

1.1 고급언어와 저급언어

 

C, C++, JAVA와 같은 프로그래밍 언어들은 모두 사람들이 이해하기 쉽게 만든 고급언어이다. 

반대로 컴퓨터가 직접 이해하고 실행할 수 있는 언어를 저급언어라고 한다.

 

저급언어는 명령어로 이루어져 있다. 

저급언어는 0과1로 이루어진 기계어와 0과1을 전역한 어셈블리어가 있다.

 

짜피 컴퓨터가 고급언어에서 저급언어로 바꿔주는데 왜 저급언어를 알아냐하냐!!라고 할 수 있지만

하드웨어랑 밀접한 임베디드 개발자, 게임개발자, 정보보안 전문가 등의 개발자들은 어셈블리어를 많이 사용한다.

어셈블리어를 잘 관잘하면 프로그램이 어떤 절차로 작동하는지 이해할 수 있기 때문에 개발자라면 알아두는 것이 좋다.

 

 

1.2 컴파일 언어와 인터프리터 언어

 

개발자들이 고급언어로 작성한 소스코드는 크게 두가지 방식으로 저급언어로 변환이되는데

이는 컴파일 방식인터프리트방식이다. 

각각의 방식으로 작동하는 프로그래밍 언어를 컴파일 언어, 인터프리터 언어라고한다.

 

컴파일언어 

컴파일 언어는 컴파일러에 의해 소스코드 전체가 저급언어로 변환되는 방식이다. 

대표적으로 C가 있다. 이 과정을 컴파일이라고한다. 

컴파일러는 소스 전체를 한번에 실행가능한지 검증한다. 이 때 오류가 하나라도 발견하면 컴파일에 실패한다.

성공적으로 수행되면 저급언어로 변환이되고 이 코드를 목적코드(object code)라고한다. 

인터프리터언어

인터프리터 언어는 소스코드가 한줄 씩 실행되는 고급언어이다.

대표적으로 파이썬이 있다.

컴파일언어와 다르게 한줄씩 실행하기 때문에 저급언어로 변환하는 시간을 기다릴 필요가 없다. 

또 오류가 있더라도 오류가 있는 코드 전 코드까지 실행이된다. 

 

이렇게 보면 컴파일언어보다 빨라보일 수 있지만 느리다.

컴파일 언어는 목적코드를 바로 실행시킬 수 있지만 인터프리터언어는 끝까지 한줄한줄 해석해야하기 때문이다. 

 

* 컴파일 언어와 인터프리터 언어는 칼로 자르듯이 구별하기 힘들다! 둘다하는 경우가 많음! 그냥 방법이 두개있다고 이해!

 

목적파일 vs 실행파일

목적코드로 이루어져있는 코드를 목적파일(*.obj)이라고 하고 실행코드로 이루어져있는 코드를 실행파일(*.exe)라고한다.

목적코드가 링킹(linking)이라는 과정을 거치면 실행코드가된다. 

목적코드도 컴퓨터가 알아들을 수 있는 언어로 이루어져있지만 어떻게 실행하는지는 못한다.

여러기능들과 연결짓는 과정이 링킹이다. 

 

 

 

2. 명령어의 구조

 

2.1 연산코드와 오퍼랜드

 

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

명령어가 수행할 연산을 연산코드라고 하고, 연산에 사용할 데이터 또는 데이터의 위치를 오퍼랜드라고한다. 

연산코드를 연산자, 오퍼랜드를 피연산자라고도한다. 

기계어와 어셈블러오 모두 위처럼 구성되어있다. 

 

오퍼랜드(피연산자)

오퍼랜드에는 숫자,문자와같은 데이터나 메모리나 레지스터의 주소가 올 수 있다. 

하지만 대부분 데이터가 들어있는 주소가 저장된다. 그래서 오퍼랜드가 담기는 영역을 주소필드라고 부른다. 

오퍼랜드는 명령어안에 여러개 존재할 수 있는데, 명령어가 n개일 때 n-주소 명령어라고한다. 

 

연산코드(연산자)

연산자는 여러종류가 많지만 크게 네가지로 나눌 수 있다. 

1. 데이터전송

2. 산술/논리 연산

3. 제어 흐름 변경

4. 입출력 제어

 

2.2 주소 지정 방식

 

연산코드 필드 안에 연산코드와 오퍼랜드를 모두 넣으면 오퍼랜드가 여러개일때 한 오퍼랜드의 공간이 너무 좁을 것이다.

그 대신 오퍼랜드를 다른데 적어두고 오퍼랜드가 적혀있는 주소를 적어두면 표현할 수 있는 정보가 늘어난다!!

레지스터를 사용할 때도 비슷하게 오퍼랜드 필드에 레지스터 이름을 명시한다.

 

연산의 대상이 되는 데이터가 저장된 위치를 유효주소라고한다. 

이렇게 오퍼랜드 필드에 데이터가 저장된 위치를 명시할 때 연산에 사용할 데이터 위치를 찾는 방법을 주소 지정 방식이라고 한다. 한마디로 유효주소를 찾는 방법이다. 

 

즉시 주소 지정 방식

연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식이다.

데이터의 크기가 작아진다는 단점이 있지만 데이터를 메모리에서 찾는 과정이 없어 빠르다.

 

직접 주소 지정 방식

오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방법이다.

이는 유효주소를 표현할 수 있는 범위가 좁아진다는 단점이있다.

 

갑접 주소 지정 방식

유효주소의 주소를 오퍼랜드 필드에 명시한다.

이렇게 되면 유효주소를 표현할 수 있는 범위가 넓어진다.

하지만 메모리 접근이 두번 필요하기 때문에 비교적 느리다.

 

레지스터 주소 지정 방식

연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방법이다.

메모리에 접근하는 것 보다 CPU 내부에 있는 레지스터에 접근하는 것이 더 빠르므로 이 방법은 빠르다.

단점은 레지스터를 표현할 수 있는 크기에 제한이 생긴다는 것이다. 

 

레지스터 간접 주소 방식

연산에 사용할 데이터를 메모리에 저장하고, 그 유효주소를 저장한 레지스터를 오퍼랜드 필드에 적는 방법이다.

간접 주소 지정방식과 비슷하지만 메모리에 접근하는 횟수가 한번으로 줄어든다는 장점이 있다.

 

* 스택과 큐

스택이란 후입선출 방법을 이용하는 자료구조이다. Last in First Out 을 줄여 LIFO라고도 부른다

새로운 데이터를 저장하는 명령어가 PUSH 꺼내는 명령어가 POP이다.

스택과는 반대로 선입선출의 규칙을 따르는 자료구조는 큐이다. First in First Out 해서 FIFO라고 부른다. 

 

 

반응형