Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

SYDev

Chapter 03-2 : 명령어의 구조 본문

Computer Architecture + Operating System/Computer Architecture

Chapter 03-2 : 명령어의 구조

시데브 2023. 7. 21. 15:47

학습 목표

  • 명령어를 자세히 살펴보며 연산 코드, 오퍼랜드, 주소 지정 방식 개념을 학습

 

연산코드와 오퍼랜드

 명령어는 연산 코드와 오퍼랜드로 구성됨

  • 연산 코드(operation): 명령어에서 수행할 연산을 의미하는 부분
  • 오퍼랜드(operand): 명령어에서 '연산에 사용할 데이터' 또는 '연산에 사용할 데이터가 저장된 위치'를 의미하는 부분

 

연산 코드(연산자) 오퍼랜드(피연산자)
더해라 100과 120을
빼라 메모리 32번지 안의 값과 메모리 33번지 안의 값을
저장해라 10을 메모리 128번지에
  • 연산 코드 필드: 연산 코드가 담기는 영역
  • 오퍼랜드 필드: 오퍼랜드가 담기는 영역
push	rbp
mov	rbp, rsp		
mov	DWORD PTR [rbp-4], 1
add	eax, edx
pop	rbp
ret

 위는 어셈블리어를 의미하고 왼쪽 부분이 연산 코드, 오른쪽 부분이 오퍼랜드를 의미

 

오퍼랜드

 오퍼랜드 필드에는 숫자나 문자 같은 데이터 혹은 메모리 주소나 레지스터 주소가 올 수 있는데, 대부분의 경우에서 메모리 주소나 레지스터 이름이 담긴다. 이런 의미에서 오퍼랜드 필드를 주소 필드라고 부르기도 한다.

  • 0-주소 명령어: 오퍼랜드가 하나도 없는 명령어
  • 1-주소 명령어: 오퍼랜드가 하나인 명령어
  • 2-주소 명령어: 오퍼랜드가 둘인 명령어
  • 3-주소 명령어: 오퍼랜드가 셋인 명령어

 

연산 코드

 연산 코드 유형은 크게 데이터 전송, 산술/논리 연산, 제어 흐름 변경, 입출력 제어 네 가지로 나눌 수 있다.

 

  • 데이터 전송
MOVE 데이터를 옮겨라
STORE 메모리에 저장하라
LOAD(FETCH) 메모리에서 CPU로 데이터를 가져와라
PUSH 스택에 데이터를 저장하라
POP 스택의 최상단 데이터를 가져와라

 

  • 산술/논리 연산
ADD/SUBTRACT/MULTIPLY/DIVIDE 덧셈/ 뺄셈/ 곱셈/ 나눗셈을 수행하라
INCREMENT/DECREMENT 오퍼랜드에 1을 더하라/ 오퍼랜드에 1을 빼라
AND/OR/NOT: AND/OR/NOT 연산을 수행하라
COMPARE 두 개의 숫자 또는 TRUE/FALSE 값을 비교하라

 

  • 제어 흐름 변경
JUMP 특정 주소로 실행 순서를 옮겨라
CONDITUINAL JUMP 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
HALT 프로그램의 실행을 멈춰라
CALL(함수의 호출) 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
RETURN(함수의 리턴) CALL을 호출할 때 저장했던 주소로 돌아가라

 

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

 

 

주소 지정 방식

 명령어의 오퍼랜드 필드에 메모리 주소나 레지스터 주소를 담는 경우가 많은 이유는, 명령어의 길이를 담을 저장 공간이 충분하지 않기 때문이다.

 

 하나의 명령어가 n비트로 구성되어 있다고 가정할 때, 연산 코드 필드가 m비트면 오퍼랜드 필드에 가장 많은 공간을 할당할 수 있는 1-주소 명령어의 상황에서 오퍼랜드 필드의 길이가 n-m이 된다. 그렇다면 2-주소 명령어, 3-주소 명령어에서는 공간이 더 작아진다.

 

이때 오퍼랜드 필드 안에 메모리 주소를 명시하고 해당 주소에 데이터를 저장하면 오퍼랜드 필드가 필요로 하는 공간은 주소만 명시할 수 있는 공간이면 충분해진다. 

 

  • 유효 주소(effective address): 연산의 대상이 되는 데이터가 저장된 위치
  • 주소 지정 방식(adressing mode): 오퍼랜드 필드가 저장된 위치를 명시할 때 연산에 사용할 데이터 위치를 찾는 방법, 여기에는 대표적으로 5가지 방식이 존재한다.

 

즉시 주소 지정 방식

  • 즉시 주소 지정 방식(immediate addressing mode): 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식
  • 표현할 수 있는 데이터 크기는 작아지지만, 데이터에 직접적으로 접근하는만큼 이하 주소 지정 방식들보다 빠르다.

 

직접 주소 지정 방식

  • 직접 주소 지정 방식(direct addressing mode): 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
  • 오퍼랜드 필드에서 표현할 수 있는 데이터의 크기가 즉시 주소 지정 방식보다 커졌다.

 

간접 주소 지정 방식

  • 간접 주소 지정 방식(indirect addressing mode): 유효주소의 주소를 오퍼랜드 필드에 명시하는 방식
  • 직접 주소 지정 방식보다 표현할 수 있는 유효 주소의 범위가 넓어졌지만, 메모리에 두 번 접근하기 때문에 앞선 방식들보다 일반적으로 느리다.

 

레지스터 주소 지정 방식

  • 레지스터 주소 지정 방식(register addressing mode): 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방식
  • CPU 외부에 있는 메모리에 접근하기보다 CPU 내부에 있는 레지스터에 접근하기 때문에, 빠르게 데이터에 접근할 수 있다.

 

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

  • 레지스터 간접 주소 지정 방식(register indirect addressing mode): 연산에 사용할 데이터를 메모리에 저장하고, 그 주소(유효 주소)를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방식
  • 간접 주소 지정 방식과 비슷하지만, 메모리에 접근하는 횟수가 한 번으로 줄어든다는 장점이 있다.
  • 유효 주소를 레지스터에 저장했기 때문에 간접 주소 지정 방식보다 빠르다.

 

스택과 큐

  • 스택(stack): 한쪽 끝이 막혀 있는 통과 같은 저장 공간.
  • 나중에 저장한 데이터를 가장 먼저 빼내는 데이터 관리 방식(후입선출) -> LIFO(Last In First Out) 자료 구조
  • 큐(queue): 양쪽이 뚫려 있는 통과 같은 저장 공간.
  • 가장 먼저 저장된 데이터부터 빼내는 데이터 관리 방식(선입선출) -> FIFO(First In First Out) 자료 구조

 


  출처 : 강민철, <혼자 공부하는 컴퓨터구조 + 운영체제>, 한빛미디어(주), 2022.08.16