맨위로가기

MMIX

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

MMIX는 256개의 64비트 범용 레지스터와 32개의 특수 목적 레지스터를 가진 축소 명령어 집합 컴퓨터(RISC) 아키텍처이다. 64비트 가상 주소 공간을 사용하며 고정 길이 32비트 명령어를 사용한다. MMIX는 MMIXAL 어셈블리 언어로 프로그래밍되며, MMIXware를 비롯한 다양한 소프트웨어 도구로 지원된다. 하드웨어 구현 사례는 알려져 있지 않지만, FPGA를 이용한 구현 프로젝트가 존재하며, GNU 컴파일러 모음에 C/C++ 컴파일러 백 엔드가 포함되어 있다.

더 읽어볼만한 페이지

  • 추상 기계 - 튜링 기계
    튜링 기계는 앨런 튜링이 제시한 계산 모델로, 테이프 위에서 기계적으로 작동하며, 유한한 상태, 테이프, 헤드, 명령 표를 통해 작동하고, 계산 가능성과 알고리즘의 한계를 연구하는 데 사용된다.
  • 도널드 커누스 - 컴퓨터 프로그래밍의 예술
    도널드 커누스가 집필한 컴퓨터 과학 분야의 대표 저서인 컴퓨터 프로그래밍의 예술은 자료 구조, 알고리즘, 준수치적 알고리즘, 정렬 및 검색, 조합론적 알고리즘 등 프로그래밍 핵심 주제를 깊이 있게 다루고 문제 해결 능력 향상에 기여하며, MIX/MMIX 어셈블리 언어 분석을 통해 튜링상 수상 및 "세기의 과학을 형성한 100여 권의 책"으로 선정되는 등 높은 평가를 받았다.
  • 도널드 커누스 - TeX
    TeX는 도널드 커누스가 개발한 수학, 과학, 공학 분야의 고품질 문서 출력을 위한 조판 시스템이며, 수학 수식 조판에 특화된 매크로 시스템과 높은 확장성을 제공한다.
  • 명령어 집합 구조 - ARM 아키텍처
    ARM 아키텍처는 저전력 설계로 모바일 기기에서 널리 쓰이는 RISC 기반 프로세서 아키텍처로서, IP 코어 라이선스 모델과 ARM Flexible Access를 통해 다양한 분야로 확장되고 있다.
  • 명령어 집합 구조 - PA-RISC
    PA-RISC는 휴렛 팩커드에서 개발한 RISC 기반 명령어 집합 아키텍처로, HP 서버 및 워크스테이션에 사용되었으며 대용량 L1 캐시와 SIMD 명령어 확장 등의 특징을 가졌으나 아이테니엄 아키텍처로의 전환으로 단종되었다.
MMIX
MMIX 정보
설계자도널드 크누스
비트 수64비트
설계 방식RISC
인코딩고정
분기조건 코드
엔디언빅 엔디언
공개 여부예, 로열티 없음
레지스터 수256
범용 레지스터32개의 특수 목적 레지스터

2. 구조

MMIX는 64비트 가상주소공간을 가진 빅 엔디안 형태의 이진 컴퓨터이며, 명령어는 32비트이다. MMIX는 256개의 64비트 범용 레지스터, 32개의 64비트 특수 목적 레지스터, 고정 길이 32비트 명령어 및 64비트 가상 주소 공간을 가진 빅 엔디안 64비트 축소 명령어 집합 컴퓨터(RISC)이다. MMIX 명령어 집합은 256개의 연산 코드로 구성되며, 그 중 하나는 향후 확장을 위해 예약되어 있다. MMIX는 IEEE 754 부동 소수점 숫자를 사용한다.

2. 1. 명령어

MMIX의 모든 명령어는 관련된 약어(니모닉)를 가진다. 예를 들어, 10진수 32번 명령어는 'ADD'와 연결된다. 대부분의 명령어는 "OP X, Y, Z" 형태를 따르는데, 여기서 OP는 명령어 종류, X는 결과를 저장할 레지스터를 지정하고, 나머지는 명령어에 사용할 값을 나타낸다. 각 부분은 모두 8비트이다. MMIX 프로그램은 보통 MMIXAL 어셈블리 언어로 구성된다.

(하위 섹션 '명령어 예시'에서 "ADD $0, $1, 3" 명령어에 대한 설명이 이미 자세하게 제공되고 있으므로, 중복을 피하기 위해 이 문단에서는 해당 예시를 생략한다.)

2. 1. 1. 명령어 예시

MMIX 명령어는 대부분 "OP X, Y, Z" 형태를 따르며, 각 부분은 8비트이다. OP는 명령어 코드, X는 결과를 저장할 레지스터를 나타낸다.

예를 들어, "ADD $0, $1, 3" 명령어는 1번 레지스터의 값과 3을 더하여 그 결과를 0번 레지스터에 저장한다. 명령어의 각 부분에 대한 설명은 다음과 같다.

  • ADD: 덧셈 명령어 (명령어 코드 32)
  • $0: 결과를 저장할 레지스터 (0번 레지스터)
  • $1: 연산에 사용할 첫 번째 값 (1번 레지스터의 값)
  • 3: 연산에 사용할 두 번째 값 (즉시 값 3)


MMIX 프로그램은 주로 MMIXAL 어셈블리 언어로 작성된다.

2. 1. 2. Hello world 프로그램

MMIXAL로 Hello, world를 출력하는 프로그램은 다음과 같다.

```

Main GETA $255,string % 문자열의 주소를

% 레지스터 255에 넣는다.

TRAP 0,Fputs,StdOut % 레지스터 255가 가리키는

% 문자열을 표준

% 출력 파일에 쓴다.

TRAP 0,Halt,0 % 프로세스를 종료한다.

string BYTE "Hello, world!",#a,0 % 출력할 문자열. #a는

% 줄 바꿈 문자, 0은

% 문자열을 종료한다.

2. 2. 레지스터

MMIX는 256개의 64비트 범용 레지스터와 32개의 64비트 특수 목적 레지스터를 가진 축소 명령어 집합 컴퓨터(RISC)이다.[4] MMIX 명령어 집합은 256개의 연산 코드로 구성되며, IEEE 754 부동 소수점 숫자를 사용한다. MMIX 칩에는 $0부터 $255까지 256개의 직접 주소 지정이 가능한 범용 레지스터와 32개의 특수 목적 레지스터가 있으며, 특수 목적 레지스터는 GET 및 PUT 명령어로 접근할 수 있다.

2. 2. 1. 범용 레지스터

MMIX 칩에는 $0부터 $255까지 번호가 매겨진 256개의 범용 레지스터와 32개의 특수 레지스터가 있다.[4] 이 중 rL과 rG라는 두 개의 특수 레지스터는 일반 레지스터 중 어떤 것이 로컬이고 어떤 것이 글로벌인지 결정한다.

  • 로컬 레지스터: $0부터 ([rL] − 1) 범위의 레지스터이다. 내부 레지스터 스택에 대한 윈도우를 나타낸다.
  • 마지널 레지스터: [rL]부터 ([rG] − 1) 범위의 레지스터이다. 연산의 소스로 사용될 경우 항상 0을 반환한다. 마지널 레지스터를 연산의 대상으로 사용하면 해당 레지스터를 포함하도록 rL이 자동 증가한다.
  • 글로벌 레지스터: [rG]부터 $255 범위의 레지스터이다. 레지스터 스택의 일부가 아니며, 임의의 루틴에서 접근 가능하다.


로컬 레지스터는 서브루틴 호출 시 자동으로 전환되지만, 전환하지 않는 호출 방법도 있다. 물리적인 레지스터 구성은 MMIX에서 규정되지 않지만, 예를 들어 글로벌 레지스터를 256-32개, 로컬 레지스터를 512개 물리적으로 준비하는 등의 구성을 생각할 수 있다.

2. 2. 2. 로컬 레지스터 스택

MMIX 칩은 $0부터 $255까지 번호가 매겨진 256개의 범용 레지스터와 32개의 특수 목적 레지스터를 가지고 있다.[4] 이 중 특수 레지스터인 rL과 rG는 일반 레지스터 중 어떤 것이 로컬 레지스터이고 어떤 것이 글로벌 레지스터인지를 결정한다.

  • 로컬 레지스터: $0부터 $(rL - 1)까지의 레지스터는 로컬 레지스터로, 내부 레지스터 스택의 윈도우를 형성한다.[4] 각 서브루틴은 $0부터 $(rL - 1)까지 지정된 고유한 rL 로컬 레지스터를 가진다. 서브루틴이 호출될 때마다 여러 개의 로컬 레지스터가 스택 아래로 푸시되고, 호출된 서브루틴의 인수는 나머지 로컬 레지스터에 남게 된다. 서브루틴 완료 시 이전에 푸시된 레지스터를 팝한다.
  • 마지널 레지스터: [rL]부터 $(rG - 1)까지의 레지스터는 "마지널 레지스터"이다. 연산의 소스로 사용될 경우 항상 0을 반환하며, 연산의 대상으로 사용하면 rL이 자동 증가하여 해당 레지스터를 포함한다.
  • 글로벌 레지스터: [rG]부터 $255까지의 레지스터는 글로벌 레지스터로, 레지스터 스택의 일부가 아니다.


내부 레지스터 스택은 유한한 수의 레지스터만 포함할 수 있으므로, 스택의 일부를 메모리에 저장해야 할 수 있다.[4] 이는 특수 레지스터 rO와 rS를 사용하여 구현되며, 이들은 로컬 레지스터 스택의 어느 부분이 메모리에 있고 어느 부분이 여전히 로컬 물리 레지스터에 있는지 기록한다. 레지스터 스택은 빠른 서브루틴 연결을 제공한다.

로컬 레지스터 스택은 레지스터 윈도우와 유사하지만, 구체적인 구현 방식은 정의되어 있지 않다. 예를 들어, 루틴 A가 $0부터 $4까지를 로컬 레지스터로 사용하고, 인수를 2개 갖는 루틴 B를 호출하는 경우를 생각해 보자. $5를 루틴 B의 결과 저장 영역으로 하고, $6과 $7에 인수를 설정하여 루틴 B를 호출하면, 루틴 B에서는 $6이 $0, $7이 $1로 보이게 된다. 루틴 B가 $0에 반환값을 저장하고 루틴 A로 돌아오면, 루틴 A에서는 $5에 해당 반환값이 보이게 된다.

물리 레지스터에는 한계가 있으므로, 모든 콜 스택을 레지스터에 보존할 수는 없다. 스택 내용의 레지스터에서 메모리로의 이동(또는 그 반대)은 자동으로 이루어지며, rO 레지스터와 rS 레지스터가 메모리상의 스택과 레지스터 스택의 관련성을 설정한다.

2. 2. 3. 특수 레지스터

MMIX 칩은 32개의 특수 레지스터를 가지고 있으며, 이들은 GET 및 PUT 명령어를 통해 접근할 수 있다. 특수 레지스터는 MMIX 아키텍처의 다양한 기능을 제어하고 상태 정보를 저장하는 데 사용된다.

다음은 32개의 특수 레지스터에 대한 설명이다.

번호이름설명
0rB (부트스트랩 레지스터, 트립)트립 발생 시, rB ← $255이고 $255 ← rJ가 된다. 이는 rJ(반환 점프 레지스터)를 범용 레지스터에 저장하는 데 사용된다.
1rD (피제수 레지스터)부호 없는 정수 나눗셈에서 128비트 피제수의 왼쪽 절반(상위 64비트)으로 사용된다.
2rE (엡실론 레지스터)부동 소수점 비교 시 엡실론 값과 관련된 비교에 사용된다.
3rH (고배수 레지스터)부호 없는 정수 곱셈 결과의 왼쪽 절반(상위 64비트)을 저장한다.
4rJ (반환 점프 레지스터)PUSH 명령에 의해 다음 명령어의 주소를 저장하고, POP 명령에서 반환하는 데 사용된다.
5rM (멀티플렉스 마스크 레지스터)멀티플렉스 명령어에 사용된다.
6rR (나머지 레지스터)정수 나눗셈의 나머지를 저장한다.
7rBB (부트스트랩 레지스터, 트랩)트랩 발생 시, rBB ← $255이고 $255 ← rJ가 된다. rJ를 범용 레지스터에 저장한다.
8rC (사이클 카운터)매 사이클마다 증가한다.
9rN (일련 번호)특정 MMIX 프로세서를 식별하는 상수 값이다.
10rO (레지스터 스택 오프셋)레지스터 스택을 구현하는 데 사용된다.
11rS (레지스터 스택 포인터)레지스터 스택을 구현하는 데 사용된다.
12rI (간격 카운터)매 사이클마다 감소하며, 0이 되면 인터럽트를 발생시킨다.
13rT (트랩 주소 레지스터)트립 벡터의 주소를 저장한다.
14rTT (동적 트랩 주소 레지스터)트랩 벡터의 주소를 저장한다.
15rK (인터럽트 마스크 레지스터)특정 인터럽트를 활성화하거나 비활성화하는 데 사용된다.
16rQ (인터럽트 요청 레지스터)인터럽트 발생 시 인터럽트를 기록한다.
17rU (사용 카운터)실행된 명령어의 수를 유지한다.
18rV (가상 변환 레지스터)가상 주소를 물리적 주소로 변환하는 데 사용되며, 세그먼트 크기, 페이지 테이블 루트 위치, 주소 공간 번호 등을 포함한다.
19rG (글로벌 임계값 레지스터)rG보다 크거나 같은 번호를 가진 범용 레지스터는 글로벌 레지스터로 간주된다.
20rL (로컬 임계값 레지스터)rL보다 작은 번호를 가진 범용 레지스터는 로컬 레지스터로 간주된다.
21rA (산술 상태 레지스터)오버플로, 0으로 나누기 등 산술 예외를 기록하고 활성화/비활성화하는 데 사용된다.
22rF (실패 위치 레지스터)실패를 일으킨 명령어의 주소를 저장한다.
23rP (예측 레지스터)조건부 스왑(CSWAP) 명령어에 사용된다.
24rW (인터럽트 발생 위치 레지스터, 트립)트립 발생 시 인터럽트된 명령어 다음 명령어의 주소를 저장한다.
25rX (실행 레지스터, 트립)트립 발생 시 인터럽트된 명령어를 저장한다.
26rY (Y 피연산자, 트립)트립 발생 시 인터럽트된 명령어의 Y 피연산자를 저장한다.
27rZ (Z 피연산자, 트립)트립 발생 시 인터럽트된 명령어의 Z 피연산자를 저장한다.
28rWW (인터럽트 발생 위치 레지스터, 트랩)트랩 발생 시 인터럽트된 명령어 다음 명령어의 주소를 저장한다.
29rXX (실행 레지스터, 트랩)트랩 발생 시 인터럽트된 명령어를 저장한다.
30rYY (Y 피연산자, 트랩)트랩 발생 시 인터럽트된 명령어의 Y 피연산자를 저장한다.
31rZZ (Z 피연산자, 트랩)트랩 발생 시 인터럽트된 명령어의 Z 피연산자를 저장한다.



특수 레지스터 중 rL과 rG는 일반 레지스터 중 어떤 것이 로컬이고 어떤 것이 글로벌인지 결정한다. $0부터 [rL]-1 범위의 레지스터는 로컬 레지스터이며, [rL]부터 [rG]-1 범위의 레지스터는 "마지널 레지스터"이다. [rG]부터 $255 범위의 레지스터는 글로벌 레지스터이다.

3. 인터럽트

MMIX 프로그램은 타이머와 같은 외부 하드웨어에 의해 선점 인터럽트될 수 있다. 또한, 가상 메모리 구현에 사용되는 메모리 보호 페이지 폴트 예외나 부동 소수점 예외 처리와 같이, 특정 예외적인 경우에 명령어가 인터럽트를 발생시키기도 한다.[1]

MMIX는 "트립"과 "트랩"이라는 두 가지 종류의 인터럽트를 가진다. "트립"은 사용자 응용 프로그램의 "트립 핸들러"로 제어를 보내고, "트랩"은 운영 체제의 "트랩 핸들러"로 제어를 보낸다는 점에서 차이가 있다. 사용자는 TRIP 및 TRAP 명령어를 통해 명시적인 소프트웨어 인터럽트를 발생시켜 인터럽트 핸들러를 실행할 수도 있다. 특히, 사용자 프로그램에서 운영 체제로의 시스템 호출은 TRAP 명령어를 사용한다.[1]

4. 하드웨어 구현

2015년 10월 기준으로, MMIX 명령어 집합 구조를 하드웨어로 구현한 사례는 알려진 바가 없다. 하지만, fpgammix[5] 프로젝트는 MMIX를 Verilog로 구현하여 필드 프로그래머블 게이트 어레이(FPGA)를 사용하여 구현할 수 있게 한다.

MMIX는 이진법 컴퓨터이며(MIX에서는 십진법을 병용했었다), 64비트 가상 주소 공간과 32비트 폭의 명령어 집합을 갖는다. (빅 엔디안 방식)

5. 소프트웨어 도구

MMIX 명령어 집합 아키텍처는 컴퓨터 아키텍처 연구 및 소프트웨어 개발을 위한 여러 소프트웨어 도구로 지원된다. 대표적으로 MMIXware, MMIXX, GCC용 MMIX 백엔드 등이 있다.[6]

5. 1. 시뮬레이터 및 어셈블러


  • MMIXware[6] - 도널드 커누스의 MMIX-SIM 단순(행위적) 시뮬레이터, MMIXAL 어셈블러, 테스트 스위트, 샘플 프로그램, 전체 설명서 및 MMIX 아키텍처(파이프라인) 시뮬레이터(gzip 압축 tar 파일)이다.
  • MMIXX[7] - X11 기반 그래픽 패키지이다. MIT 이론물리센터의 앤드루 포친스키가 기여했으며, 위 MMIXware 소스와 결합하여 MMIX 가상 머신을 640×480 픽셀, 트루 컬러 '가상 디스플레이'(UNIX/Linux용)로 보강한다.

5. 2. 컴파일러

GNU 컴파일러 모음에는 한스-피터 닐슨(Hans-Peter Nilsson)이 기여하고 2001년 말부터 GCC 메인 배포판의 일부가 된 MMIX 백 엔드가 C/C++ 컴파일러에 포함되어 있다.[8] 2017년 11월 기준으로 MMIX 백 엔드는 자원 봉사자에 의해 지속적으로 개발 및 유지 관리되고 있다.

  • 한스-피터 닐슨(Hans-Peter Nilsson)의 GCC + MMIX 도구 설치 지침.[8]
  • §3.17.26. GNU GCC 버전 7.2.0의 MMIX 옵션[9]
  • §9.28. GNU as의 MMIX 종속 기능[10] (GNU Binutils 웹사이트). GNU GCC용 어셈블러 백 엔드(GNU Binutils 웹사이트) 버전 2.29.


이러한 도구들은 이론적으로 MMIX 하드웨어가 존재한다면 전체 FreeBSD, 리눅스, 또는 기타 유사한 운영 체제 커널을 컴파일, 빌드 및 부트스트랩하는 데 사용될 수 있다.

참조

[1] 간행물 MMIXware: A RISC Computer for the Third Millennium https://books.google[...] Springer-Verlag 1999-10
[2] 웹사이트 MMIX Home: A Message From Don Knuth http://mmix.cs.hm.ed[...] 2021-05-23
[3] offset 7:36 MMIX: A RISC Computer for the New Millennium https://www.youtube.[...] 1999-02-09
[4] 서적 MMIX—A RISC Computer for the New Millennium Addison Wesley
[5] 웹사이트 fpgammix https://github.com/t[...] 2024-09-27
[6] 웹사이트 MMIXware https://www-cs-facul[...] Cs-faculty.stanford.edu 2014-05-25
[7] 웹사이트 MMIXX https://www.malgil.c[...] Malgil.com 2002-03-06
[8] 문서 Installation instructions for GCC + MMIX tools http://bitrange.com/[...]
[9] 문서 §3.17.26. MMIX https://gcc.gnu.org/[...]
[10] 웹사이트 §9.28 MMIX Dependent Features https://sourceware.o[...] Sourceware.org 2017-11-20



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com