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. HennessyとDavid 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つ多い負の整数が含まれます。
| ミックスレジスタ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
レジスター
MIX には 9 つのレジスタがあります。
- rA :アキュムレータ(フルワード、5 バイトと符号)。
- rX : 拡張 (フルワード、5 バイトと符号)。
- rI1、rI2、rI3、rI4、rI5、rI6 :インデックスレジスタ(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 | 28 | 2 7 | 2 6 | 2 5 | 2 4 | 2 3 | 2 2 | 2 1 | 2 0 | 1 9 | 1 8 | 1 7 | 1 6 | 1 5 | 1 4 | 1 3 | 1 2 | 1 1 | 1 0 | 09 | 08 | 07 | 0 6 | 0 5 | 0 4 | 0 3 | 0 2 | 0 1 | 0 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,i | rA := ADDR + rIi; |
ENTX ADDR,i | rX := ADDR + rIi; |
ENT? ADDR,i | rI? := ADDR + rIi; |
ENNA ADDR,i | rA := - ADDR - rIi; |
ENNX ADDR,i | rX := - ADDR - rIi; |
ENN? ADDR,i | rI? := - ADDR - rIi; |
INCA ADDR,i | rA := rA + ADDR + rIi; |
INCX ADDR,i | rX := rX + ADDR + rIi; |
INC? ADDR,i | rI? := rI? + ADDR + rIi; |
DECA ADDR,i | rA := rA - ADDR - rIi; |
DECX ADDR,i | rX := rX - ADDR - rIi; |
DEC? ADDR,i | rI? := 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,i | goto 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,iJGE, 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,iJANN/JANZ/JANP ADDR,i | rA < 0またはrA == 0またはrA > 0の場合、ADDR + rIiに移動します。rA > = 0またはrA ! = 0またはrA < = 0の場合、ADDR + rIiに移動します。 |
JXN/JXZ/JXP ADDR,iJXNN/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,iJ?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,iSLAX/SRAX ADDR,iSLC/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; |
NUM | rA := numerical value of characters in (rA,rX); |
CHAR | (rA,rX) := character codes representing value of rA; |
実装
MIXは、以下のソフトウェアによって実装されています。
MIXの実装は2021年にiCE40HX8K FPGAボード用に作成されました。 [4]
参照
参考資料
- ^ ドナルド・クヌース(1997年5月)『コンピュータプログラミングの技法 第1巻 基礎アルゴリズム』(第3版)アディソン・ウェスリー・ロングマン社、124ページ。ISBN 0-201-89683-4.
- ^ – 9マニュアルページ
- ^ CPANのHardware::Simulator::MIX Perlモジュール
- ^ "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本