명령어
언어 번역 방식, 주소 지정 방식 정리
고급 언어와 저급 언어
우리가 작성하는 소스코드는 컴퓨터가 직접 이해하지 못함.
- 우리는 고급 언어(C, C++, Java, Python 등)를 사용하고,
- 컴퓨터는 저급 언어(기계어, 어셈블리어)만 이해하기 때문
기계어와 어셈블리어
소스 코드 번역 방식
소스코드를 컴퓨터가 이해할 수 있도록 저급 언어로 변환하는 방식은 두 가지가 있다.
1. 컴파일 방식
- 전체 소스 코드를 한 번에 번역해서 실행
- 번역된 결과: 목적 코드(object code)
- 예: C 언어
✅ 장점:
❌ 단점:
- 컴파일 과정에서 오류가 하나라도 있으면 실행 불가
2. 인터프리터 방식
- 소스 코드를 한 줄씩 번역하면서 실행
- 예: Python
✅ 장점:
- 오류가 있는 줄을 실행하기 전까지는 나머지 코드가 실행됨
❌ 단점:
⚠️ 고급 언어는 컴파일 언어 vs 인터프리터 언어처럼 명확히 나뉘지 않음.
많은 언어가 두 속성을 모두 갖거나 전환 가능하기 때문
명령어 구조
컴퓨터 명령어는 다음 두 부분으로 구성됨.
- 연산 코드 (Opcode): 어떤 연산을 할지 정의
- 오퍼랜드 (Operand): 연산에 사용할 데이터
오퍼랜드는 연산의 대상이며, 데이터, 메모리 주소, 레지스터 등이 올 수 있음.
그래서 오퍼랜드 필드를 주소 필드라고도 부름.
주소 지정 방식 (Addressing Modes)
오퍼랜드 필드에 연산 대상의 주소나 값을 명시하는 방식.
대표적으로 다섯 가지 방식
- 데이터를 오퍼랜드 필드에 직접 명시
- 가장 단순하고 빠르지만, 표현 가능한 데이터 크기에 제한이 있음
2. 직접 주소 지정 방식 (Direct Addressing)
- 유효 주소를 직접 명시
- 표현 가능한 주소의 범위가 연산 코드 길이에 제한받음
3. 간접 주소 지정 방식 (Indirect Addressing)
- 유효 주소의 주소를 오퍼랜드 필드에 명시
- 표현 범위는 넓지만, 메모리 접근이 2회 필요하여 느림
4. 레지스터 주소 지정 방식 (Register Addressing)
- 데이터를 저장한 레지스터를 오퍼랜드 필드에 명시
- 메모리보다 빠름
- 그러나 사용 가능한 레지스터 수에 제한
5. 레지스터 간접 주소 지정 방식 (Register Indirect Addressing)
- 데이터를 메모리에 저장하고,
그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시
- 간접 주소 지정과 유사하지만, 메모리 접근은 1번만 필요
연산 코드의 유형
명령어의 연산 코드는 다음과 같은 유형으로 나뉨.
- 데이터 전송 (Data Transfer)
- 산술/논리 연산 (Arithmetic/Logical Operations)
- 제어 흐름 변경 (Control Flow)
- 입출력 제어 (I/O Control)