명령어란,
명령어는 컴퓨터에서 실행할 작업과 동작을 나타내는 명령이다.
CPU는 메모리에서 명령어를 가져와 해석하고 실행한다.
명령어은 프로그램의 기본 구성 요소이고, 컴퓨터 시스템의 동작과 프로그래밍을 할때 중요한 개념이다.
명령어 구조
명령어 구조는 여러 부분으로 나누어진다.
컴퓨터 아키텍쳐마다 다 다르기 때문에 주로 사용되는 명령어 구조인 명령코드, 주소지정방식, 오퍼랜드로 되어있다.
명령코드 (OP code)
명령코드란, 컴퓨터에서 실행할 명령을 나타내는 부분이다.
명령코드는 CPU가 해석하며 동작을 수행한다. 각 명령어들은 고유한 코드인 명령코드가 할당되어 있으며 명령코드로 각각 명령의 작업들을 구별한다.
명령코드는 보통 이진수로 되어 있으며 길이는 컴퓨터 아키텍쳐마다 다를 수 있다.
명령어 집합이 작으면 OPcode에 비트수가 적어지고, 명령어 집합이 크고 복잡하면 OPcode의 비트수가 늘어난다.
CPU는 명령어를 메모리에서 가져와서 해석해서 실행할 작업을 결정한다.
해석하는 부분을 Decoder이라고 한다. Decoder은 OPcode를 인식하고 어떤 기능을 하고 연산을 수행하는지 판단한다.
이후 CPU는 해당하는 작업을 수행한다.
명령코드는 기계어에 정의되어 있다.
OPcode 예시
8bit
MOV => 데이터 이동
ADD => 덧셈
SUB => 뺄셈
CMP => 비교
JMP => 점프
32bit
LOAD => 데이터 로드
STORE => 데이터 저장
JNZ => 조건부 점프
64bit
FMA => Fused Multiply-Add
이런 여러가지 명령어 이외에 매우 많은 명령어가 있다.
오퍼랜드(Operand)
오퍼랜드는 명령어에서 작업을 수행을 위해 데이터의 주소를 나타내는 부분이다.
명령어를 실행하려면 오퍼랜드가 필요하다.
오퍼랜드는 레지스터 값, 메모리 주소, 인덱스 등등으로 표현된다.
레지스터 오퍼랜드 : 레지스터는 CPU에 있는 메모리이다. 속도가 매우 빠르고 데이터를 임시로 저장하고 처리하는데 사용된다. 레지스터 오퍼랜드는 명령어가 작업을 수행할때 사용할 레지스터를 지정하는 것이다. 레지스터 이름이나 번호를 사용하여 표현되고, R1, EAX, XMMO등등이 있다.
메모리 오퍼랜드 : 메모리에 위치한 데이터나 주소를 지정하는 것이다. 메모리 주소값으로 표현되며 CPU가 해당 메모리 주소에 접근해 데이터를 가져오거나 저장하는 작업을 한다. 메모리 오퍼랜드는 주소값 자체가 될 수 도 있고, R1이나 (R1+8)등 과 같이 레지스터 값을 바탕으로 계산하는 방식이다.
인덱스 오퍼랜드 : 오퍼랜드가 레지스터나 메모리 주소를 바탕으로 인덱싱을 하는 경우에 사용된다. 배열에 자주 사용된다고 생각하면 이해하기가 쉽다.
상수 오퍼랜드 : 명령어에 사용되는 고정된 값이다. 만약 덧셈 명령어를 한다면, 더해지는 값을 나타내는 상수를 나타낼 수 있다. [ADD R1, 10] 처럼 10이 상수 오퍼랜드로 사용된 예시이다.
반경 오퍼랜드 : 두개의 오퍼랜드로 범위를 나타낸다. 반복문을 사용하는데 사용한다고 생각하면 이해가 쉽다.
명령어 예시
덧셈 명령어 예시이다.
명령 코드 : 0001
오퍼랜드 1 : R3
오퍼랜드 2 : R2
오퍼랜드 3 : R3
이 명령어를 2진수로 표현하면,
0001 001 010 011
이런식으로 예시를 들 수 있다.
이 명령어를 설명해보면,
Opcode : 0001 => 덧셈연산
Operand 1 : 001 => R1 register
Operand 2 : 010 => R2 register
Operand 3 : 011 => R3 register
이 명령어는 R3 = R1 + R2이다.
주소지정방식
일단 유효주소를 알아야한다.
유효주소란 데이터가 실제로 저장된 주소를 유효주소라고 한다.
직접 주소 지정
명령어의 오퍼랜드가 유효 주소를 가리키는것을 말한다.
간접 주소 지정
명령어의 오퍼랜드에 유효주소의 주소가 저장되어있다.
그 오퍼랜드에 있는 주소가 유효주소를 가리켜 두번을 접근해야한다.
그럼 굳이 두번 접근해야해서 속도도 느린 간접주소지정을 왜 사용하냐면
오퍼랜드가 제한이 있을 경우 긴 주소나 여러 주소에 접근 할 수 있고, 메모리 주소가 동적이면 간접 주소 지정으로 사용 가능하고, 메모리를 접근 제어하여 잘못된 주소 접근등을 방지해 보안상 이점도 있다.
레지스터 주소 방식
오퍼랜드에 레지스터를 지정하고, 레지스터에 데이터가 저장된 방식이다.
레지스터 간접 주소 방식
오퍼랜드에 레지스터 번호를 나타내고 그 레지스터의 내용이 유효주소인 방식이다.
묵시적 주소 지정
오퍼랜드가 지정되어 있지 않고 명령어의 정의에 의해 정해져 있는 방식이다.
오퍼랜드를 1개 사용하는 명령어나 무주소 명령어에서 사용된다.
주소지정이 필요없어서 빠르고 편리하지만, 가독성이 낮고 데이터의 주소를 직접 다루기가 어려운 점이 있다.
즉치 주소 지정 방식
명령어의 주소 필드에 데이터가 들어있다.
저장장치에 접근이 필요없어서 편리하고 빠르지만 길이의 크기가 제한이 있다.
상대 주소 지정 방식
상대 주소로 접근하며 분기 명령어인 경우 사용된다.
베이스 레지스터 주소 지정 방식
상대 주소 지정 방식에서 베이스 레지스터에 있는 주소에서 상대 주소를 접근하는 것이다.
명령어 사이클
명령어 사이클은 명령어 인출, 명령어 해독, 데이터 인출, 데이터 처리, 데이터 저장 이 있다.
끝!
명령어에선 명령코드와 오퍼랜드가 같이 붙어있어야지만 의미가 있다.
명령코드는 CPU한테 어떤 작업을 수행하는지 알려주고, 오퍼랜드는 그 작업을 할때 필요한 데이터나 데이터 주소를 줘야 하기 때문이다.
그래서 우리가 컴퓨터를 쓰려면 명령코드와 오퍼랜드 둘이서 맨날 붙어있어야한다!
'system' 카테고리의 다른 글
VMware에서 Hyper-V로 바꿔보기! (4) | 2023.07.14 |
---|