명령어 집합 비교

**[[명령어 집합]]**(instruction set architectures, **ISA**)은 **[[컴퓨터 구조]]**라고도 불리는 컴퓨터의 추상적인 모델이다. ISA의 구현을 구현체라고 한다. ISA는 성능, 물리적 크기, 비용 등에서 다양할 수 있는 여러 구현을 허용한다. ISA는 소프트웨어와 하드웨어 간의 인터페이스 역할을 하므로, ISA를 위해 작성되거나 컴파일된 소프트웨어는 동일한 ISA의 다른 구현체에서 실행될 수 있다. 이는 다양한 세대의 컴퓨터 간에 이진 호환성을 쉽게 달성하고 컴퓨터 제품군을 개발할 수 있도록 했다. 이 두 가지 발전은 컴퓨터 비용을 낮추고 적용 가능성을 높이는 데 도움이 되었다. 이러한 이유로 ISA는 오늘날 컴퓨팅에서 가장 중요한 추상화 중 하나이다.

ISA는 기계어 프로그래머가 컴퓨터를 프로그래밍하기 위해 알아야 할 모든 것을 정의한다. ISA가 정의하는 내용은 ISA마다 다르다. 일반적으로 ISA는 지원되는 자료형, 존재하는 상태(예: 주기억장치 및 레지스터) 및 그 의미(예: 메모리 일관성 및 주소 지정 모드), 명령어 집합(컴퓨터의 기계어를 구성하는 기계어 명령어 집합), 그리고 입출력 모델을 정의한다.

## 데이터 표현
컴퓨팅 초창기에는 이진, 십진, 심지어 삼진법을 사용하는 컴퓨터도 있었다. 현대 컴퓨터는 거의 전적으로 이진법을 사용한다.

문자는 다양한 문자 집합을 사용하여 비트 또는 숫자의 문자열로 인코딩된다. 단일 제조업체 내에서도 문자 집합 차이가 존재했다.

정수는 부호-크기, 1의 보수, 2의 보수, 오프셋 이진, 9의 보수 및 10의 보수를 포함한 다양한 표현으로 인코딩된다.

유사하게, 부동소수점 숫자는 부호, 지수 및 가수에 대해 다양한 표현으로 인코딩된다. 현대 기계에서는 IBM 16진 부동소수점과 IEEE 754 부동소수점이 이전 형식을 크게 대체했다.

주소는 일반적으로 명령어의 필드, 레지스터의 데이터 및 저장소의 데이터 조합으로 생성된 부호 없는 정수이며, 세부 사항은 아키텍처에 따라 다르다.

### 비트
컴퓨터 구조는 종종 n-비트 아키텍처로 설명된다. 20세기 첫 3/4분기에는 n이 종종 12, 18, 24, 30, 36, 48 또는 60이었다. 20세기 마지막 1/3분기에는 n이 종종 8, 16, 또는 32였고, 21세기에는 n이 종종 16, 32 또는 64이지만 다른 크기(6, 39, 128 포함)도 사용되었다. 이는 컴퓨터 아키텍처가 명령어 집합에 몇 가지 "자연스러운" 데이터 크기를 더하거나 덜 가지고 있지만, 이들의 하드웨어 구현은 매우 다를 수 있으므로 실제로는 단순화된 것이다. 많은 명령어 집합 아키텍처는 프로세서의 주요 내부 데이터 경로 크기의 절반 및 두 배로 작동하는 명령어를 가지고 있다. 이의 예로는 Z80, MC68000, IBM 시스템/360이 있다. 이러한 유형의 구현에서는 두 배 넓은 작업이 일반적으로 클럭 사이클의 약 두 배를 필요로 한다(고성능 구현에서는 그렇지 않다). 예를 들어 68000에서는 4클럭 틱 대신 8클럭 틱을 의미하며, 이 특정 칩은 32비트 아키텍처와 16비트 구현으로 설명될 수 있다. IBM 시스템/360 명령어 집합 아키텍처는 32비트이지만, IBM 시스템/360 모델 30과 같은 시스템/360 시리즈의 여러 모델은 더 작은 내부 데이터 경로를 가지고 있으며, 360/195와 같은 다른 모델은 더 큰 내부 데이터 경로를 가지고 있다.

외부 데이터 버스 폭은 아키텍처의 폭을 결정하는 데 사용되지 않는다. NS32008, NS32016 및 NS32032는 기본적으로 동일한 32비트 칩으로 서로 다른 외부 데이터 버스를 가지고 있었다. IBM의 PowerPC 604는 64비트 버스를 가지고 있지만 32비트 레지스터만 있다. 시스템/360 프로세서와 모토로라 68000과 같은 일부 초기 32비트 마이크로프로세서는 24비트 주소를 가지고 있다.

아키텍처에서 명령어의 비트 폭은 반드시 아키텍처의 비트 폭과 같을 필요는 없다. 예를 들어, 시스템/360, PDP-11 아키텍처, VAX, x86 아키텍처의 명령어는 가변 길이이다. 슈퍼H의 초기 버전은 32비트 아키텍처임에도 불구하고 고정 길이 16비트 명령어를 가졌고, 이후 버전은 16비트 및 32비트 명령어를 모두 가졌다.

### 자릿수
20세기 첫 3/4분기에는 워드 지향 십진법 컴퓨터가 일반적으로 별도의 부호를 가진 10자릿수 워드를 가졌고, 정수에는 10자릿수 모두를 사용하고 부동소수점 숫자에는 지수에 두 자릿수를 사용했다.

### 엔디언
아키텍처는 "빅" 또는 "리틀" 엔디언을 사용하거나 둘 다 사용하거나 둘 중 하나를 사용하도록 구성할 수 있다. 리틀 엔디언 프로세서는 다중 바이트 값의 최하위 바이트를 가장 낮은 메모리 위치에 저장한다. 빅 엔디언 아키텍처는 대신 최상위 바이트를 가장 낮은 주소에 저장한다. x86 아키텍처와 여러 8비트 아키텍처는 리틀 엔디언이다. 대부분의 RISC 아키텍처(SPARC, Power, PowerPC, MIPS)는 원래 빅 엔디언(ARM은 리틀 엔디언)이었지만, 많은 아키텍처(ARM 포함)는 이제 둘 중 하나로 구성할 수 있다.

엔디언은 일부 데이터 형식보다 작은 데이터 단위(예: 바이트)의 개별 주소 지정을 허용하는 프로세서에만 적용된다.

## 명령어 형식

### 명령 코드

일부 아키텍처에서는 명령어가 단일 명령 코드를 갖는다. 다른 아키텍처에서는 일부 명령어가 명령 코드와 하나 이상의 수정자를 갖는다. 예를 들어, IBM 시스템/370에서는 바이트 0이 명령 코드이지만 바이트 0이 인 경우 바이트 1이 특정 명령어를 선택한다. 예를 들어, 은 스토어 클럭(STCK)이다. 일부 명령어 집합 아키텍처에서는 하나 이상의 명령 코드 접두사가 후속 명령 코드를 변경하거나 명령 코드 수를 확장하는 데 사용된다.

### 피연산자

#### 주소 지정 방식

아키텍처는 일반적으로 명령어가 다음과 같은 피연산자 주소 지정 모드의 조합을 포함하도록 허용한다.

;직접
:명령어가 완전한 주소를 지정한다.
;즉치
:명령어가 주소 대신 값을 지정한다.
;인덱싱
:명령어가 인덱스로 사용할 레지스터를 지정한다. 일부 아키텍처에서는 인덱스가 피연산자 길이로 스케일링된다.
;간접
:명령어가 피연산자를 설명하는 포인터 워드의 위치를 지정하며, 여러 수준의 인덱싱 및 간접 지정을 포함할 수 있다.
;잘림
:명령어가 하위 비트를 지정하고 레지스터가 상위 비트를 제공한다.
;기저-변위
:명령어가 레지스터에 있는 주소로부터의 변위를 지정한다.
;자동증가/자동감소
:인덱싱에 사용되는 레지스터 또는 간접 주소 지정에 사용되는 포인터 워드는 1, 피연산자 크기 또는 명시적 델타만큼 증가 또는 감소한다.
벡터 프로세서는 요소 기반 작업에 고유한 추가 모드를 제공한다.

#### 피연산자 수

피연산자 수는 명령어 집합의 성능을 나타내는 요소 중 하나이다.
3-피연산자 아키텍처(2-입력, 1-출력)는 다음을 허용한다.
 A := B + C
하나의 명령어로 계산된다.
 ADD B, C, A

2-피연산자 아키텍처(1-입력, 1-입력-및-출력)는 다음을 허용한다.
 A := A + B
하나의 명령어로 계산되지만, 다음이 필요하다.
 A := B + C
두 개의 명령어로 수행된다.
 MOVE B, A
 ADD C, A

### 인코딩 길이
아래 표에서 볼 수 있듯이 일부 명령어 집합은 매우 간단한 고정 인코딩 길이를 유지하고 다른 명령어 집합은 가변 길이를 갖는다. 일반적으로 RISC 아키텍처는 고정 인코딩 길이를 가지며 CISC 아키텍처는 가변 길이를 갖지만 항상 그런 것은 아니다.

## 명령어 집합
아래 표는 명령어 집합 아키텍처에 대한 기본 정보를 비교한다.

참고:
* 일반적으로 레지스터 수는 2의 거듭제곱이며, 예를 들어 8, 16, 32이다. 경우에 따라서는 하드와이어드-제로 의사 레지스터가 아키텍처의 레지스터 파일의 "일부"로 포함되는데, 주로 인덱싱 모드를 단순화하기 위함이다. "레지스터" 열은 특정 시점에 일반 명령어에 의해 사용될 수 있는 정수 "레지스터"만 계산한다. 아키텍처는 항상 프로그램 카운터(PC)와 같은 특수 목적 레지스터를 포함한다. 언급되지 않는 한 이들은 계산되지 않는다. SPARC와 같은 일부 아키텍처에는 레지스터 윈도우가 있다는 점에 유의한다. 이러한 아키텍처의 경우, 개수는 레지스터 윈도우 내에서 사용 가능한 레지스터 수를 나타낸다. 또한 레지스터 이름 변경을 위한 비아키텍처 레지스터는 계산되지 않는다.
* "유형" 열에서 "레지스터-레지스터"는 일반적인 아키텍처 유형인 "로드-스토어"의 동의어이며, 이는 일부 특수 명령어(예: 레지스터로 로드하거나 레지스터에서 저장하는 명령어)를 제외하고는 어떤 명령어도 메모리에 직접 액세스할 수 없음을 의미한다. 원자적 작업을 위한 메모리 잠금 명령어가 예외일 수 있다.
* "엔디언" 열에서 "Bi"는 엔디언이 구성 가능하다는 의미이다.

## 같이 보기
* 중앙 처리 장치 (CPU)
* 프로세서 설계
* CPU 마이크로아키텍처 비교
* 명령어 집합
* 마이크로프로세서
* 벤치마크 (컴퓨팅)

## 내용주

## 각주


분류:컴퓨터 구조