본문 바로가기
CS/컴퓨터 구조&운영체제

[컴퓨터 구조 & 운영체제] 3.명령어

by supernovaMK 2024. 4. 24.

고급언어,저급언어


고급언어: 사람을 위한 언어

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

 

 

이때 저급언어는 두가지로 나뉜다.

1.기계어

2.어셈블리어

 

먼저 기계어는 0과 1비트로 이루어진 언어로 가독성을 위해 16진수로 표현되기도 한다.

 

이처럼 0과 1로 이루어진 기계어를 이해하기는 어렵기 때문에 이를 읽기 쉬운 형태로 번역한

어셈블리어가 있다.  ex)push,mov,pop,ret....등

하드웨어적인 부분과 개발을 함께 할 때 많이 사용된다.

 

 

 

 

고급언어에서 저급언어로 변환 되는 과정에는 크게 두가지가 있다.

1.컴파일 방식

2.인터프리트 방식

 

이 두가지 방식에 따라 변환 되는 고급 언어를 컴파일 언어,인터프리터 언어라고 칭한다.

 

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

컴파일러라는 도구를 통해 컴파일 과정을 거치며 저급언어로 변환되는데 이때 변환된 저급언어를 목적 코드라고 칭한다.

소스코드에 오류가 있는 경우에는 컴파일에 실패하게 된다.

 

인터프리터 언어는 언터프리터에 의해 소스 코드가 한 줄씩 실행되는 언어로 대표적으로 python이 있다.

전체가 한번에 컴파일 되는 컴파일 언어와 달리 한줄씩 실행되는 특징이 있다. 즉 한줄씩 저급언어로 변환해서 실행해주는 도구를 인터프리터라고 한다. 

 

일반적으로 인터프리터 언어가 컴파일 언어보다 느리다.

 

자바와 같은 언어는 컴파일 언어인지 인터프리터 언어인지 모호한 경우이다. 나머지 파이썬도 컴파일 과정이 없는 것이 아닌 것 처럼 꼭 구분지어야한느 개념이 아니다.


명령어 구조


명령어는 크게 두가지로 구분된다.

1.연산 코드

2.오퍼랜드

 

명령어가 수행할 연산을 연산 코드라 하고 

연산에 사용할 데이터,및 저장된 위치를 오퍼랜드라고한다. 

명령어 구조

오퍼랜드

데이터와 데이터가 저장된 주소를 보통 가지고 있다. 이때 주소를 담는 경우가 대부분인데,이 때문에 주소필드라고 부르기도 한다. 오퍼랜드의 개수에 따라 0-주소 명령어,1-주소 명령어,2-주소 명령어,3-주소 명령어 로 나뉜다.

 

ex)mov eax,1  ->2-주소 명령어

 

연산 코드

연산 코드는 수행할 연산을 담고 있으며 대표적인 4가지가 있다. 생김새는 CPU환경마다 다르다.

 

1.데이터 전송       (MOVE,STORE,LOAD,PUSH,POP)

2.산술/논리 연산  (ADD/SUBSTACT,INCREMENT, AND/OR/NOT,COMPARE)

3.제어 흐름 변경  (JUMP,HALT,CALL)

4.입출력 제어       (READ,WRITE,START IO,TEST IO)

 

 


주소 지정 방식


오퍼랜드에 데이터 정보의 주소를 저장할 때 방식이 여러가지 있다. 대표적인 것들을 소개해보겠다.

 

즉시 주소 지정 방식

사용할 데이터를 오패랜드 필드에 직접 명시 하는 방식,제일 빠르지만 데이터의 크기에 한계가 있다.

직접 주소 지정 방식

유효 주소를 직접적으로 명시하는 방식,하지만 유효 주소 크기의 한계가 있다.

간접 주소 지정 방식

유효 주소의 주소를 오퍼랜드에 명시한다. 두번의 메모리 접근이 일어나 앞서 말한 방식들 보다는 느린 방식이다.

 

레지스터 주소 지정 방식

레지스터의 유효 주소를 오퍼랜드에 명시하는 방식이다.

 

레지스터 간접 주소 지정 방식

메모리의 유효 주소가 적혀있는 레지스터의 유효 주소를 오퍼랜드에 명시하는 방법이다.  레지스터 접근하는 것이 메모리 접근 방식 보다 빠르기 때문에 간접 주소 지정 방식 보다 빠르다.

 


 

 

 

앞서 말한 명령어들의 CPU에서 동작 과정의 사이클을 보자면 아래 그림과 같다. 이 과정에 관해서는 CPU설명에서 추가적으로 하겠다.