コンピューターを小さな郵便局として見てみましょう。
部門には、外部と通信するための2つのウィンドウがあります。それらは、INPウィンドウに入り、番号が0から999までの番号になります。 3桁の番号のリーフレットを作成し、これらのリーフレットを新しいものに置き換えることもできます。 彼はまた、3桁の数字を加算および減算できる単純な電卓(バッテリー)を持っています。 計算機で数値を処理するとき、0以上で0より大きい数値のフラグが自動的に立てられます。
コンピューターオペレーターは、プログラムをリーフレットに書き込み、それらをメールボックスに配置してから、コマンドカウンター(PC)を0に設定し、[開始]ボタンをクリックします。 郵便局の中では、小さな男がメールボックスに番号が入ったリーフレットを処理しています。 処理サイクルをステップで説明します。
- コマンドカウンターから番号を選択します。 この番号はメールボックス番号です。
- 手順1で番号を取得したメールボックスの番号を覚えておいてください。
- コマンドカウンターを1増やします。
- コマンドを解析します(手順2で取得した数)。
- 必要に応じて、メールボックスからデータを取得します。
- コマンド自体を実行します。
- 必要に応じて、データをメールボックスに保存します。
- ステップ1に戻るか、コマンドが0の場合は停止します。
コマンドは3桁の10進数であり、数百の数がコマンドのタイプを決定し、数十と単位の数はメールボックスの数を示します。
チームコード | チームの種類 | アクション |
---|---|---|
1xx | 追加 | xxボックスの数字をバッテリーに追加します。 フラグZEROまたはPOSITIVE NUMBERを上げます。 結果が999を超える場合、ジョブをエラーで終了します。 |
2xx | SUB | バッテリーのxxボックスから数値を引きます。 フラグZEROまたはPOSITIVE NUMBERを上げます。 結果が0未満の場合、バッテリーは変更されず、フラグは省略されます。 |
3xx | STA | ボックスxxにバッテリーの内容を保存します。 |
5xx | LDA | xxボックスからバッテリーに番号をロードします。 フラグZEROまたはPOSITIVE NUMBERを上げます。 |
6xx | ブラジャー | コマンドカウンタをxxに設定します。 |
7xx | BRZ | フラグがゼロの場合、コマンドカウンターをxxに設定します。 |
8xx | BRP | フラグがZEROまたはPOSITIVE NUMBERの場合、コマンドカウンターをxxに設定します。 |
901 | Inp | INPウィンドウから番号を選択し、バッテリーに書き込みます。 フラグZEROまたはPOSITIVE NUMBERを上げます。 数値が0〜999の範囲に収まらない場合、エラーでジョブを終了します。 |
902 | アウト | バッテリーの番号を紙に書き、OUTウィンドウに入れます。 |
000 | Hlt | 作業を終了します。 |
そのため、小さなコマンドセットを備えたフォンノイマンアーキテクチャのコンピューターについて説明しました。 モデルはコマンドのバイナリエンコーディングを使用しないため、このコンピューターのプログラムを簡単に作成できます。コンピューターデバイスをホワイトボードに描画し、プログラムを紙の上で実行できます。 20世紀の60年代には、多くの学生がこの方法でプログラムを実行したと思いますが、AWKで行ったようなコンピューター用のエミュレーターを作成できるようになりました。
エミュレータのソースコードとサンプルプログラム: GitHub
エミュレータは次のコマンドで起動します:
awk -f lmc.awk
エミュレータコマンド:
LOAD ### [### ...]-プログラムをコードでロードします DUMP-メモリーの内容を表示 RUN-プログラムを実行する ASM <ファイル名>-アセンブラーでプログラムをコンパイルしてロード
いくつかの短いプログラム:
LOAD 901 902 000-INPからOUTに番号をコピーし、停止します LOAD 901 104 902 000 1-INPからの数値に1を加算、OUTに書き込み、停止 LOAD 901 902 704 600 000-INPからOUTに番号をコピーし、0の印刷後に動作を停止します
プログラムを開始する例:
負荷901902 0 ダンプ 00:901 902 0 0 0 0 0 0 0 0 0 10:0 0 0 0 0 0 0 0 0 0 0 0 20:0 0 0 0 0 0 0 0 0 0 0 0 30:0 0 0 0 0 0 0 0 0 0 0 0 40:0 0 0 0 0 0 0 0 0 0 0 0 50:0 0 0 0 0 0 0 0 0 0 0 0 60:0 0 0 0 0 0 0 0 0 0 0 0 70:0 0 0 0 0 0 0 0 0 0 0 0 80:0 0 0 0 0 0 0 0 0 0 0 0 90:0 0 0 0 0 0 0 0 0 0 0 0 走る INP:100 OUT:100
同じ長さとシンプルなコマンド形式により、このコンピューターのアセンブラーをすばやく作成できます。 その後、アドレスを手動で計算せずに長いプログラムを作成できます。
フィボナッチ数:
awk -f lmc.awk asm fib.lma 00: #Print fibonacci numbers 00: LDA ONE #Load init values 01: STA FIB1 #First number 02: STA FIB2 #Second number 03: OUT #Print first 04: OUT #Print second 05: LOOP LDA MAX #ACC=MAX 06: SUB FIB1 #ACC=ACC-FIB1 07: SUB FIB2 #ACC=ACC-FIB2 08: BRP CONT #ACC positive ? Continue 09: BRA END #Negative : goto end of program 10: CONT LDA FIB1 #ACC=FIB1 11: ADD FIB2 #ACC=ACC+FIB2 12: STA FIBN #Store FIBN - next number 13: OUT #Print it 14: LDA FIB2 #FIB1=FIB2 15: STA FIB1 16: LDA FIBN #FIB2=FIBN 17: STA FIB2 18: BRA LOOP #Next LOOP 19: END HLT 20: ONE DAT 1 #Init value 21: FIB1 DAT #First fib number 22: FIB2 DAT #Second fib number 23: FIBN DAT #Next fib number 24: MAX DAT 999 #Max computer number Labels: LOOP 05 MAX 24 FIB1 21 FIB2 22 FIBN 23 ONE 20 END 19 CONT 10 Xrefs: LOOP 18 MAX 5 FIB1 1 6 10 15 FIB2 2 7 11 14 17 FIBN 12 16 ONE 0 END 9 CONT 8 LOAD 520 321 322 902 902 524 221 222 810 619 521 122 323 902 522 321 523 322 605 0 1 0 0 0 999