MIX(抽象機械)

ミックス
デザイナードナルド・クヌース
ビット31ビット
導入1968
設計アキュムレータマシン
タイプ仮説的
エンコード固定
分岐条件コードとレジスタテスト
エンディアンビッグ
オープンはい、ロイヤリティフリーです
レジスター
合計9台

MIXは、ドナルド・クヌースのモノグラフ『The Art of Computer Programming』TAOCP )で使用されている架空のコンピュータです。MIXのモデル番号は1009で、これは著者が重要だと考えた同時代の市販マシンのモデル番号と名前を組み合わせて付けられました。また、「MIX」をローマ数字で読むと1009になります

1960 年代の MIX は、その後、新しい (これも仮説的な) コンピュータ アーキテクチャであるMMIXに置き換えられ、 TAOCPの今後のバージョンに組み込まれる予定です

MIXアーキテクチャとMMIXアーキテクチャの両方に対応したソフトウェア実装は、Knuthによって開発され、無料で提供されています(それぞれ「MIXware」と「MMIXware」という名前です)。KnuthのMIX/MMIXエミュレータの派生版もいくつか存在します。GNU MDKはそのようなソフトウェアパッケージの一つで、無料で提供されており、様々なプラットフォームで動作します。

教育におけるその目的は、John L. HennessyDavid A. Patterson『Computer Organization and Design - The Hardware Software Interface』のDLXアーキテクチャと非常によく似ています

アーキテクチャ

MIXは2進法10進法を組み合わせたコンピュータです。2進法でプログラムすると、各バイトは6ビット(値の範囲は0から63)になります。10進法では、各バイトは2桁の10進数(値の範囲は0から99)になります。MIXバイトの2つの解釈(2進法と10進法)は異なるマシンタイプを表し、直接互換性があるようには設計されていません

MIXは、2進数と10進数の両方の性質を持つという特異な特性を持っています。MIXプログラマーは、自分が2進数でプログラミングしているのか、10進数でプログラミングしているのかを実際には意識していません。そのため、MIXで書かれたアルゴリズムは、ほとんど変更を加えることなくどちらのタイプのマシンでも使用でき、どちらのタイプのマシンでもMIXは簡単にシミュレートできます。2進数マシンに慣れているプログラマーはMIXを2進数として考えることができ、10進数マシンに慣れているプログラマーはMIXを10進数として考えるかもしれません。別の惑星から来たプログラマーは、MIXを3進数コンピュータとして考えるかもしれません。[1]

バイトは5バイトと符号からなるワードにグループ化されます。MIX用に作成されたプログラムのほとんどは、2進数として解釈した場合に1バイトあたり63を超える値、10進数として解釈した場合に99を超える値を格納しない限り、2進数でも10進数でも動作します。

1ワードの範囲は、2進モードでは-1,073,741,823から1,073,741,823(両端を含む)、10進モードでは-9,999,999,999から9,999,999,999(両端を含む)です。MIXアーキテクチャにおける整数の符号と絶対値の表現は、「-0」と「+0」を区別します。これは、現代のコンピュータとは対照的です。現代のコンピュータでは、整数の2の補数表現にはゼロの表現が1つ含まれますが、与えられたビット数の範囲には、表現可能な正の整数の数よりも1つ多い負の整数が含まれます。

ミックスレジスタ
30 29 282 72 62 52 42 32 22 12 01 91 81 71 61 51 41 31 21 11 009 08 070 60 50 40 30 20 10 0(ビット位置)
レジスター
±A1A2A3A4A5rA、アキュムレータ
±X1X2X3X4X5rX、拡張機能
インデックスレジスタ
 ±I1.4I1.5rI1、インデックス1
 ±I2.4I2.5rI2、インデックス2
 ±I3.4I3.5rI3、インデックス3
 ±I4.4I4.5rI4、インデックス4
 ±I5.4I5.5rI5、インデックス5
 ±I6.4I6.5rI6、インデックス6
プログラムカウンタ
 J4J5rJ、ジャンプ
条件コードフラグ
 Oオーバーフローフラグ
 <=>比較フラグ

レジスター

MIX には 9 つのレジスタがあります。

  • rA :アキュムレータ(フルワード、5 バイトと符号)。
  • rX : 拡張 (フルワード、5 バイトと符号)。
  • rI1rI2rI3rI4rI5rI6 :インデックスレジスタ(2バイトと符号)。
  • rJ : ジャンプ アドレス (2 バイト、常に正)。

1バイトは少なくとも6ビットとみなされます。ほとんどの命令では、(first:last)という形式の接尾辞を使用して、レジスタのどの「フィールド」(バイト)を変更するかを指定できます。0番目のフィールドは1ビットの符号です。

MIX は、前の操作がオーバーフローしたかどうかも記録し、1 つのトリットの比較インジケーター (より小さい、等しい、またはより大きい) を持ちます。

メモリと入出力

MIXマシンには4000ワードのメモリ(それぞれ5バイトと符号)があり、アドレスは0から3999です。また、さまざまな入出力デバイスも含まれています

  • テープ ユニット (デバイス 0...7)。
  • ディスクまたはドラム ユニット (デバイス 8...15)。
  • カードリーダー(デバイス16)。
  • カードパンチ(デバイス17)。
  • ラインプリンター(デバイス18)。
  • タイプライター端末(デバイス19)。
  • 紙テープ(デバイス20)。

命令

メモリ内の各マシン命令は1ワードを占め、4つの部分で構成されます。メモリ内の読み取りまたは書き込みアドレス(2バイトとワードの符号)、アドレスに追加するインデックス指定(1バイト、使用するrIインデックスレジスタを記述)、レジスタまたはメモリ位置のどの部分を読み取りまたは変更するかを指定する変更(1バイト)、およびオペレーションコード(1バイト)です。すべてのオペレーションコードには、関連するニーモニックがあります

30 29 282 72 62 52 42 32 22 12 01 91 81 71 61 51 41 31 21 11 009 08 070 60 50 40 30 20 10 0
±住所索引変更操作

MIXプログラムでは、特にサブルーチンからの戻り時に自己変更コードを頻繁に使用します。これは、MIXには自動サブルーチンリターンスタックがないためである。自己変更コードは変更バイトによって容易になり、プログラムは、例えばターゲット命令のアドレス部分にデータを格納し、命令の残りの部分は変更しないままにしておくことができる

MIX プログラムは通常、MIXAL アセンブリ言語を使用して構築されます。例については、hello world プログラムのリスト ページを参照してください。

LDA ADDR,i(0:5)rA := memory[ADDR + rIi];
LDX ADDR,i(0:5)rX := memory[ADDR + rIi];
LD? ADDR,i(0:5)rI? := memory[ADDR + rIi];
LDAN ADDR,i(0:5)rA := - memory[ADDR + rIi];
LDXN ADDR,i(0:5)rX := - memory[ADDR + rIi];
LD?N ADDR,i(0:5)rI? := - memory[ADDR + rIi];
STA ADDR,i(0:5)memory[ADDR + rIi] := rA;
STX ADDR,i(0:5)memory[ADDR + rIi] := rX;
ST? ADDR,i(0:5)memory[ADDR + rIi] := rI?;
STJ ADDR,i(0:5)memory[ADDR + rIi] := rJ;
STZ ADDR,i(0:5)memory[ADDR + rIi] := 0;
ADD ADDR,i(0:5)rA := rA + memory[ADDR + rIi];
SUB ADDR,i(0:5)rA := rA - memory[ADDR + rIi];
MUL ADDR,i(0:5)(rA,rX) := rA * memory[ADDR + rIi];
DIV ADDR,i(0:5)
rA : = int ( ( rA , rX ) /メモリ[ ADDR + rIi ] ); rX : = ( rA , rX ) %メモリ[ ADDR + rIi ];              
ENTA ADDR,irA := ADDR + rIi;
ENTX ADDR,irX := ADDR + rIi;
ENT? ADDR,irI? := ADDR + rIi;
ENNA ADDR,irA := - ADDR - rIi;
ENNX ADDR,irX := - ADDR - rIi;
ENN? ADDR,irI? := - ADDR - rIi;
INCA ADDR,irA := rA + ADDR + rIi;
INCX ADDR,irX := rX + ADDR + rIi;
INC? ADDR,irI? := rI? + ADDR + rIi;
DECA ADDR,irA := rA - ADDR - rIi;
DECX ADDR,irX := rX - ADDR - rIi;
DEC? ADDR,irI? := rI? - ADDR - rIi;
CMPA ADDR,i(0:5)比較rAするmemory[ADDR + rIi] and set comparison flag;
CMPX ADDR,i(0:5)比較rXするmemory[ADDR + rIi] and set comparison flag;
CMP? ADDR,i(0:5)比較rI?するmemory[ADDR + rIi] and set comparison flag;
JMP ADDR,i
rJ :=次の命令アドレス; ADDR + rIiに移動します;        
JSJ ADDR,igoto ADDR + rIi;
JOV ADDR,i
if ( overflow ) then Overflow := false ; ADDR + rIiに移動します;          
JNOV ADDR,i
if (オーバーフローなし) then goto ADDR + rIi ; else Overflow := false ;           
JL, JE, JG ADDR,i
JGE, JNE, JLE ADDR,i
if ( less , equal , greater ) then goto ADDR + rIi ; if ( no less , unequal , no greater ) then goto ADDR + rIi ;                  
JAN/JAZ/JAP ADDR,i
JANN/JANZ/JANP ADDR,i
rA < 0またはrA == 0またはrA > 0場合ADDR + rIiに移動します。rA > = 0またはrA ! = 0またはrA < = 0場合ADDR + rIi移動します                    
JXN/JXZ/JXP ADDR,i
JXNN/JXNZ/JXNP ADDR,i
rX<0 または rX==0 または rX>0 の場合、ADDR + rIi に移動します。if (rX>=0 or rX!=0 or rX<=0) then goto ADDR + rIi;
J?N/J?Z/J?P ADDR,i
J?NN/J?NZ/J?NP ADDR,i
if (rI?<0 or rI?==0 or rI?>0) then goto ADDR + rIi;if (rI?>=0 or rI?!=0 or rI?<=0) then goto ADDR + rIi;
MOVE ADDR,i(F)
( n = 0 ; n < F ; n ++ , rI1 ++ )の場合、メモリ[ rI1 ] :=メモリ[ ADDR + rIi + n ];           
SLA/SRA ADDR,i
SLAX/SRAX ADDR,i
SLC/SRC ADDR,i
バイト単位rAで左/右にシフトします。バイト単位で左/右にシフトします。バイト単位で左/右に回転します。ADDR+rIi
(rA,rX)ADDR+rIi
(rA,rX)ADDR+rIi
NOP何もしない。
HLT実行を停止する
IN ADDR,i(F)入力ユニットから1ブロックをF
読み込みmemory[ADDR + rIi]
OUT ADDR,i(F)F
以降はユニットに 1 つのブロックを出力しますmemory[ADDR + rIi]
IOC ADDR,i(F)I/Oユニットに制御命令を送信しますF
JRED ADDR,i(F)if (i/o unit F is ready) then goto ADDR + rIi;
JBUS ADDR,i(F)if (i/o unit F is busy) then goto ADDR + rIi;
NUMrA := numerical value of characters in (rA,rX);
CHAR(rA,rX) := character codes representing value of rA;

実装

MIXは、以下のソフトウェアによって実装されています。

  • KnuthのMIXWareと派生したGNU MDK
  • 9frontのミックス(1); [2]
  • CPANのHardware::Simulator::MIX [3]

MIXの実装は2021年にiCE40HX8K FPGAボード用に作成されました。 [4]

参照

参考資料

  1. ^ ドナルド・クヌース(1997年5月)『コンピュータプログラミングの技法 第1巻 基礎アルゴリズム』(第3版)アディソン・ウェスリー・ロングマン社、124ページ。ISBN 0-201-89683-4.
  2. ^ mix(1)  – 9マニュアルページ
  3. ^ CPANのHardware::Simulator::MIX Perlモジュール
  4. ^ "Michael Schröder / mix-fgpa". GitLab .
  • MMIX 2009:第三千年紀のためのRISCコンピュータ Knuthの公式MIXページ
  • MMIXニュース クヌースの公式MIXニュース
  • MIX: the design of a typical computer and its assembly language on Open Library at the Internet Archive 、表紙はトム・ミックスによる、Knuth の 1970 年オリジナル公式 MIX 本。
  • MMIXware: 第三千年紀のためのRISCコンピュータ Knuthの公式MIX本
Retrieved from "https://en.wikipedia.org/w/index.php?title=MIX_(abstract_machine)&oldid=1316340066"