혼자 공부하는 컴퓨터 구조 03. 명령어 - swkim0128/PARA GitHub Wiki


type: ComputerArchitecture archive: false

03.1 소스 코드와 명령어

고급 언어와 저급 언어

고급 언어는 사람이 이해하기 쉽도록 디자인된 프로그래밍 언어로, 높은 추상화 수준을 가지고 있습니다. 이는 프로그래머가 프로그램을 작성할 때 복잡한 세부 사항을 신경쓰지 않아도 되도록 도와줍니다. 대표적으로 C, Java, Python 등이 있습니다.

반면 저급 언어는 컴퓨터가 이해하기 쉬운 프로그래밍 언어로, 이진수 형태로 작성됩니다. 이는 하드웨어 제어나 성능 최적화 등에 유리합니다. 대표적으로 어셈블리어가 있으며, 하드웨어 제어나 성능 최적화 등에 유리합니다.

flowchart LR
	고급언어(고급 언어) -- 변환 --> 저급언어1(저급 언어)
	저급언어2(저급 언어) --- 기계어(기계어) & 어셈블리어(어셈블리어)

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

컴파일 언어는 고급 언어로 작성된 코드를 컴파일러를 통해 기계어로 변환한 후 실행하는 방식입니다. 이에 비해 인터프리터 언어는 고급 언어 코드를 한 줄씩 해석하여 실행하는 방식입니다. 대표적으로 C, C++는 컴파일 언어에 해당하며, Python, Ruby는 인터프리터 언어에 해당합니다.

flowchart LR
	subgraph 고급언어
		컴파일언어(컴파일 언어)
		인터프리터언어(인터프리터 언어)
	end
	컴파일언어 -- 컴파일 --- 저급언어(저급 언어)
	인터프리터언어(인터프리터 언어) -- 인터프리트 --- 저급언어

컴파일 언어에서는 소스 코드를 컴파일러를 통해 목적 파일로 변환하고, 이후 링커를 통해 실행 파일로 만듭니다. 목적 파일은 기계어로 된 오브젝트 코드와 추가 정보가 포함되어 있습니다. 이는 라이브러리 함수 호출 등의 정보를 담고 있으며, 링커를 통해 실행 파일에 통합됩니다.

실행 파일은 사용자가 직접 실행시킬 수 있는 파일로, 컴파일러와 링커에 의해 생성됩니다. 실행 파일은 목적 파일이나 라이브러리와 같은 여러 개의 오브젝트 파일로부터 생성되며, 실행 파일 안에는 컴퓨터가 실행시키기 위한 코드와 데이터가 포함되어 있습니다.

03.2 명령어의 구조

연산 코드와 오퍼랜드

명령어는 연산 코드와 오퍼랜드로 구성됩니다. 연산 코드는 명령어의 종류를 나타내고, 오퍼랜드는 해당 명령어가 수행되는 데이터나 메모리 주소 등을 나타냅니다.

예를 들어, ADD R1, R2 라는 명령어는 ADD 연산 코드와 R1, R2 라는 두 개의 오퍼랜드로 구성됩니다. 이 명령어는 R2 레지스터의 값을 R1 레지스터의 값에 더한 후, 그 결과를 R1 레지스터에 저장하는 명령어입니다.

오퍼랜드

‘연산에 사용할 데이터’ 또는 ‘연산에 사용할 데이터가 저장된 위치’를 의미 = 주소 필드

오퍼랜드가 하나도 없는 명령어를 0-주소 명령어 라고 하고, 오퍼랜드가 하나인 명령어를 1-주소 명령어 , 두 개인 명령어를 2-주소 명령어 , 세 개인 명령어 3-주소 명령어 라고 합니다.

연산 코드

연산 코드의 유형은 다음과 같습니다.

  • 데이터 전송(LOAD, STORE)
  • 산술 연산(ADD, SUB)
  • 논리 연산(AND, OR, XOR)
  • 시프트 연산(SHIFT)
  • 제어(인터럽트, BRANCH)

주소 지정 방식

명령어에서 오퍼랜드가 가리키는 메모리 주소를 계산하는 방식을 주소 지정 방식이라고 합니다.

즉시 주소 지정

명령어 자체에 오퍼랜드 값을 지정하는 방식입니다. ADD \#10과 같은 명령어는 10이라는 값을 R1 레지스터의 값에 더하는 명령어입니다.

직접 주소 지정

메모리 상의 고정된 주소를 직접 지정하는 방식입니다. ADD 1000 과 같은 명령어는 1000번지에 저장된 값을 R1 레지스터의 값에 더하는 명령어입니다.

간접 주소 지정

메모리 상의 주소를 간접적으로 지정하는 방식입니다. ADD @1000 과 같은 명령어는 1000번지에 저장된 메모리 주소가 가리키는 값을 R1 레지스터의 값에 더하는 명령어입니다.

레지스터 주소 지정

레지스터에 저장된 값이 오퍼랜드 값인 경우입니다. ADD R1, R2와 같은 명령어는 R2 레지스터에 저장된 값을 R1 레지스터의 값에 더하는 명령어입니다.

레지스터 간접 주소 지정

메모리 주소를 레지스터에 저장한 후, 레지스터 값을 오퍼랜드 값으로 사용하는 방식입니다. ADD (R1), R2와 같은 명령어는 R1 레지스터에 저장된 메모리 주소가 가리키는 값을 R2 레지스터의 값에 더하는 명령어입니다.

⚠️ **GitHub.com Fallback** ⚠️