명령어의 구조를 알아보자!

시연·2023년 12월 1일
1
post-thumbnail

🤔 연산코드와 오퍼랜드

우리는 누군가에게 명령을 할 때(부탁을 할 때) 아래와 같이 말할 겁니다

"엄마, 나 밥 좀 줘."
"윤서야, 빨래 좀 개줘~"

컴퓨터 속 명령어도 우리와 똑같다고 할 수 있다 ! 좀 더 알아보자~



👄 명령어

명령어연산코드오퍼랜드로 이루어져 있습니다.

연산코드와 오퍼랜드에 관한 설명은 사진으로 표현해봤습니당~ 이해하기 더 쉽죠??


이 사진과 같이 연산코드가 담기는 영역을 '연산 코드 필드' 라고 부르고,
오퍼랜드가 담긴 영역을 '오퍼랜드 필드' 라고 합니다.


📍 오퍼랜드

자! 이제 오퍼랜드에 대해 좀 더 자세히 알아봅시당

오퍼랜드 : '연산에 사용할 데이터' 또는 '연산에 사용할 데이터가 저장된 위치'

-> 그래서 오퍼랜드 필드에는 숫자와 문자 등을 나타내는 데이터 또는 메모리레지스터 주소가 올 수 있습니다. (연산에 사용할 데이터를 직접 명시하기보다는, 많은 경우로 연산에 사용할 데이터가 저장된 위치, 즉 메모리 주소레지스터 이름이 담깁니다.)

-> 그래서 오퍼랜드 필드를 주소 필드라고 부르기도 합니다.


밑 사진과 같이 오퍼랜드는 명령어 안에 하나도 없을 수 있고, 한 개만 있을 수 있고, 두 개 또는 세 개 등 여러 개가 있을 수 있다.



🧮 연산 코드

오퍼랜드에 대해 알아봤다면 연산 코드에 대해서도 알아봐야겠죵

연산 코드 : 명령어가 수행할 연산


✏️ 가장 기본적인 연산 코드 유형

1️⃣ 데이터 전송
2️⃣ 산술/논리 연산
3️⃣ 제어 흐름 변경
4️⃣ 입출력 제어

✏️ 대표적인 연산 코드

1️⃣ 데이터 전송

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

2️⃣ 산술/논리 연산

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

3️⃣ 제어 흐름 변경

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

4️⃣ 입출력 제어

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

📇 주소 지정 방식

주소 지정 방식 : 연산에 사용할 데이터 위치를 찾는 방법 (유효 주소를 찾는 방법)


만약 오퍼랜드 필드 안에 메모리 주소가 담긴다면 표현할 수 있는 데이터의 크기는 하나의 메모리 주소에 저장할 수 있는 공간만큼 커집니다. (오퍼랜드 필드 안에 해당 메모리 주소를 명시한다면 표현할 수 있는 정보의 가짓수가 커짐)
레지스터도 마찬가지로 표현할 수 있는 정보의 가짓수는 해당 레지스터가 저장할 수 있는 공간만큼 커진다.

📇 주소 지정 방식 5가지

1️⃣ 즉시 주소 지정 방식 : 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식

  • 단점 : 표현할 수 있는 데이터의 크기가 작아짐
  • 장점 : 빠르다. (연산에 사용할 데이터를 메모리나 레지스터로부터 찾는 과정이 없기 때문)

2️⃣ 직접 주소 지정 방식 : 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식

  • 단점 : 표현할 수 있는 오퍼랜드 필드의 길이가 연산 코드의 길이만큼 짧아져 표현할 수 있는 유효 주소에 제한이 생길 수 있음

3️⃣ 간접 주소 지정 방식 : 유효 주소의 주소를 오퍼랜드 필드에 명시하는 방식

  • 단점 : 느리다. (두 번의 메모리 접근이 필요하기 때문)

4️⃣ 레지스터 주소 지정 방식 : 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방식 (직접 주소 지정 방식과 비슷함)

  • 단점 : 표현할 수 있는 레지스터 크기에 제한이 생길 수 있음 (직접 주소 지정 방식과 비슷한 문제)
  • 장점 : 직접 주소 지정 방식부다 빠르게 데이터에 접근 가능

5️⃣ 레지스터 간접 주소 지정 방식 : 연산에 사용할 데이터를 메모리에 저장하고, 그 주소(유효 주소)를 저장한 오퍼랜드 필드에 명시하는 방식

  • 장점 : 간접 주소 지정 방식보다 빠르다. (메모리에 접근하는 횟수가 한 번으로 줄어듬)

✨ 정리 ( 오퍼랜드에 들어간 것(빠른순) )

  • 즉시 주소 지정 방식 : 연산에 사용할 데이터
  • 레지스터 주소 지정 방식 : 유효 주소 (레지스터 이름)
  • 직접 주소 지정 방식 : 유효 주소 (메모리 주소)
  • 레지스터 간접 주소 지정 방식 : 유효 주소를 저장한 레지스터
  • 간접 주소 지정 방식 : 유효 주소의 주소

☀️ 좀 더 알아보기

스택(stack) : 한쪽 끝이 막혀 있는 통과 같은 저장 공간

  • LIFO (Last In First Out) : 후입선출

큐 (queue) : 양쪽이 뚫려 있는 통과 같은 저장 공간

  • FIFO ( Fist In First Out) : 선입선출

profile
Frontend Developer

0개의 댓글