명령어 집합 비교

명령어 집합(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"는 엔디언이 구성 가능하다는 의미이다.

  비트 버전  최대 #피연산자 유형 설계  레지스터(FP/벡터 제외) 명령어 인코딩 브랜치 평가  확장 오픈 로열티프리 6502 8 1975 1 레지스터–메모리 CISC 3 가변 (8- ~ 24-비트) 조건 레지스터 리틀 6800 8 1974 1 레지스터–메모리 CISC 3 가변 (8- ~ 24-비트) 조건 레지스터 빅 6809 8 1978 1 레지스터–메모리 CISC 4 가변 (8- ~ 32-비트) 조건 레지스터 빅 680x0 32 1979 2 레지스터–메모리 CISC 8 데이터 및 8 주소 가변 조건 레지스터 빅 8080 8 1974 2 레지스터–메모리 CISC 7 가변 (8 ~ 24 비트) 조건 레지스터 리틀 8051 32 (8→32) 1977? 1 레지스터–레지스터 CISC  가변 (8 ~ 24 비트) 비교 및 분기 리틀 X86 16, 32, 64(16→32→64) v4 (x86-64) 1978 2 (정수)3 (AVX)4 (FMA4 및 VPBLENDVPx) 레지스터–메모리 CISC  가변 (8086 ~ 80386: 1에서 6 바이트 사이 가변 /w MMU + intel SDK, 80486: 2에서 5 바이트 (접두사 포함), pentium 이후: 2에서 4 바이트 (접두사 포함), x64: 4 바이트 접두사, 타사 x86 에뮬레이션: 1에서 15 바이트 (접두사 및 MMU 없음) . SSE/MMX: 4 바이트 /w 접두사 AVX: 8 바이트 /w 접두사) 조건 코드 리틀 X87, IA-32, MMX, 3DNow!, SSE,SSE2, PAE, X86-64, SSE3, SSSE3, SSE4,BMI, AVX, AES, FMA, XOP, F16C, AMX   알파 64 1992 3 레지스터–레지스터 RISC 32 (포함 "제로") 고정 (32-비트) 조건 레지스터 Bi , , ,   ARC 16/32/64 (32→64) ARCv3 1996 3 레지스터–레지스터 RISC 16 또는 32 (SP 포함)  사용자가 60개까지 늘릴 수 있음 가변 (16- 또는 32-비트) 비교 및 분기 Bi APEX 사용자 정의 명령어 ARM/A32 32 ARMv1–v9 1983 3 레지스터–레지스터 RISC  고정 (32-비트) 조건 코드 Bi NEON, Jazelle, ,TrustZone,   Thumb/T32 32 ARMv4T-ARMv8 1994 3 레지스터–레지스터 RISC  Thumb: 고정 (16-비트), Thumb-2:가변 (16- 또는 32-비트) 조건 코드 Bi NEON, Jazelle, ,TrustZone,   Arm64/A64 64 v8.9-A/v9.4-A, Armv8-R 2011 3 레지스터–레지스터 RISC 32 (스택 포인터/"제로" 레지스터 포함) 고정 (32-비트), 가변 (FMA4의 경우 32-비트 또는 64-비트 (32-비트 접두사 포함)) 조건 코드 Bi SVE 및 SVE2  AVR 8 1997 2 레지스터–레지스터 RISC 32"축소 아키텍처"에서는 16개 가변 (주로 16-비트, 4개 명령어는 32-비트) 조건 레지스터,I/O 또는범용 레지스터 비트에조건부 건너뛰기,비교 및 건너뛰기 리틀 AVR32 32 Rev 2 2006  2–3 RISC 15  가변 빅  자바 가상 머신 Blackfin 32 20003 레지스터–레지스터 RISC 2 누산기
8 데이터 레지스터

8 포인터 레지스터

4 인덱스 레지스터

4 버퍼 레지스터 가변 (16- 또는 32-비트) 조건 코드 리틀 CDC 상위 3000 시리즈 48 1963 3 레지스터–메모리 CISC 48비트 A 레지스터, 48비트 Q 레지스터, 6개 15비트 B 레지스터, 기타 가변 (24- 또는 48-비트) 여러 유형의 점프 및 스킵 빅 CDC 6000중앙 프로세서 (CP) 60 1964 3 레지스터–레지스터  24 (8개 18비트 주소 레지스터,8개 18비트 인덱스 레지스터,8개 60비트 피연산자 레지스터) 가변 (15-, 30-, 또는 60-비트) 비교 및 분기  추가 주변 처리 장치   CDC 6000주변 프로세서 (PP) 12 1964 1 또는 2 레지스터–메모리 CISC 1개 18비트 A 레지스터, 위치 1~63은 일부 명령어에 대한 인덱스 레지스터 역할을 한다. 가변 (12- 또는 24-비트) A 레지스터 테스트, 채널 테스트  추가 주변 처리 장치   크루소(네이티브 VLIW) 32 2000 1 레지스터–레지스터 VLIW  가변 (네이티브 모드에서 64- 또는 128-비트, x86 에뮬레이션에서 15 바이트) 조건 코드 리틀 엘브루스 2000(네이티브 VLIW) 64 v6 2007 1 레지스터–레지스터 VLIW 8–64 64 조건 코드 리틀 Just-in-time 동적 번역: X87, IA-32, MMX, SSE,SSE2, X86-64, SSE3, AVX   DLX 32  1990 3 레지스터–레지스터 RISC 32 고정 (32-비트) 조건 레지스터 빅    eSi-RISC 16/32 2009 3 레지스터–레지스터 RISC 8–72 가변 (16- 또는 32-비트) 비교 및 분기및 조건 레지스터 Bi 사용자 정의 명령어   iAPX 432 32 1981 3 스택 머신 CISC 0 가변 (6 ~ 321 비트)   Itanium(IA-64) 64 2001 레지스터–레지스터 EPIC 128  고정 (5비트 템플릿 태그와 3개의 명령어(각각 41비트 길이)를 포함하는 128비트 번들) 조건 레지스터 Bi(선택 가능) 인텔 가상화 기술   룽아키텍처 32, 64 2021 4 레지스터–레지스터 RISC 32 (포함 "제로") 고정 (32-비트) 리틀   M32R 32 19973 레지스터–레지스터 RISC 16  가변 (16- 또는 32-비트)조건 레지스터 Bi m88k 32 1988 3 레지스터–레지스터 RISC 32 고정 (32-비트) 비교 및 분기 빅 미코32 32  2006 3 레지스터–레지스터 RISC 32 고정 (32-비트) 비교 및 분기 빅 사용자 정의 명령어   MIPS 64 (32→64) 6프로그래머를 위한 MIPS64 아키텍처: 릴리스 6프로그래머를 위한 MIPS32 아키텍처: 릴리스 6 1981 1–3 레지스터–레지스터 RISC 4–32 (포함 "제로") 고정 (32-비트) 조건 레지스터 Bi MDMX, MIPS-3D  MIPS 오픈 MMIX 64  1999 3 레지스터–레지스터 RISC 256  고정 (32-비트) 조건 레지스터 빅    Nios II 32  2000 3 레지스터–레지스터 RISC 32 고정 (32-비트) 조건 레지스터 리틀 알테라 FPGA 장치에 인스턴스화할 수 있는 소프트 프로세서   노바 16 1969 2 레지스터–레지스터 CISC 4 고정 (16-비트) 스킵 없음 NS320xx 32 1982 5 메모리–메모리 CISC 8  가변 허프먼 코딩, 최대 23 바이트 길이 조건 코드 리틀 BitBlt 명령어 OpenRISC 32, 64 1.4OpenRISC 아키텍처 개정판  2000 3 레지스터–레지스터 RISC 16 또는 32  고정 조건 코드 Bi    PA-RISC(HP/PA) 64 (32→64) 2.0  1986 3 레지스터–레지스터 RISC 32 고정 (32-비트) 비교 및 분기 빅 → Bi  MAX PDP-5 PDP-8 12 1963 레지스터–메모리 CISC 1 누산기
1 곱셈기 몫 레지스터 고정 (12-비트) 조건 레지스터
테스트 및 분기 EAE (확장 산술 요소) PDP-11 16 1970 2 메모리–메모리 CISC 8 (프로그램 카운터 및 스택 포인터 포함, 어떤 레지스터도 스택 포인터 역할을 할 수 있음) 가변 (16-, 32-, 또는 48-비트) 조건 코드 리틀 확장 명령어 세트, 부동 명령어 세트, 부동소수점 프로세서, 상업용 명령어 세트   POWER, PowerPC, Power ISA 32/64 (32→64) 3.1 1990 3 (대부분). FMA, LD/ST-업데이트 레지스터–레지스터 RISC 32 GPR, 8개 4비트 조건 필드, 링크 레지스터, 카운터 레지스터 고정 (32-비트), 가변 (32- 또는 64-비트 (32-비트 접두사 포함)) 조건 코드, 분기-카운터 자동 감소 Bi AltiVec, APU, VSX, Cell, 부동소수점, 매트릭스 곱셈 보조 OPF 라이선스  라이선스가 있는 경우에만OpenPOWER EULA RISC-V 32, 64, 128 20250508 2010 3 레지스터–레지스터 RISC 32 (포함 "제로")  가변비교 및 분기 리틀      RX 64/32/16 2000 3 메모리–메모리 CISC 4 정수 + 4 주소 가변  비교 및 분기 리틀  S+core 16/32 2005 RISC 리틀 SPARC 64 (32→64) OSA2017오라클 SPARC 프로세서 문서 1985 3 레지스터–레지스터 RISC 32 (포함 "제로") 고정 (32-비트) 조건 코드 빅 → Bi  VIS  SPARC 아키텍처 라이선스 SuperH (SH) 32  1994 2 레지스터–레지스터 레지스터–메모리 RISC 16 고정 (16- 또는 32-비트), 가변 조건 코드(단일 비트) Bi    System/360System/370System/390z/Architecture 64 (32→64) 1964 2 (대부분)3 (FMA, 개별피연산자 기능)4 (일부 벡터 명령어) 레지스터–메모리메모리–메모리 레지스터–레지스터 CISC 16 일반16 제어 (S/370 이상)16 액세스 (ESA/370 이상)32 벡터 레지스터 (z13 이상) 가변 (16-, 32-, 또는 48-비트) 조건 코드, 비교 및 분기 , 분기-카운터 자동 감소 빅   TMS320 C6000 시리즈 32 1983 3 레지스터-레지스터 VLIW C67x에서 32개  C67x+에서 64개 고정 (32비트 명령어 8개로 구성된 256비트 번들) 조건 레지스터 Bi Transputer 32 (4→64) 1987 1 스택 머신 MISC 3 (스택으로) 고정 (8-비트) 비교 및 분기 리틀 VAX 32 1977 6 메모리–메모리 CISC 16 가변  조건 코드, 비교 및 분기 리틀  Z80 8 1976 2 레지스터–메모리 CISC 17 가변 (8 ~ 32 비트) 조건 레지스터 리틀

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

 내용주 

 각주 


분류:컴퓨터 구조