レジスタ

レジスタマップ

「レジスタ」は数値を一時的に記憶しておく場所です。ユーザから見える(ユーザが機械語命令を使って移動させることのできる)レジスタ群を図で示したものをレジスタマップといいます。DeMのレジスタマップはこのようになっています。

アキュムレータ「A」は、加減乗除などの計算や、数値の桁をずらしたりするのに使います。これらの操作をした結果がAに残ります。

汎用レジスタ「R0」~「R9」はAに数値を供給したり、数値の一時的な置き場になったりします。たとえばAに12という数値が入っていて、これに3を加えて15にしたい場合などはR0に3を入れておいてAに加えるという操作をします。

ほかのプログラミング言語を使ったことがある人には「ローカル変数」として使うといえば理解が早いかもしれません。

プログラムカウンタ「PC」はプログラムの入っているメモリ(以下プログラムメモリ)のアドレスを保持していて、次に実行される命令があるプログラムメモリのアドレスを示しています。つまり、プログラムがどこを走っているのかを覚えておくレジスタです。

ジャンプはPCに飛び先アドレスをセットすること、リセットはPCをゼロクリアすることにほかなりません。

直前のAを変更する演算命令(Cdの変更を伴う)の演算結果 A>0 Cd=0
A=0 Cd=1
A<0 Cd=2
エラー Cd=3

ス テータス(状態)レジスタ「SR」は、直前の計算結果がどうなったのかを保持します。最下位桁の「Cond(またはCd)」という部分は条件判断をすると きに使います。演算命令の実行後、Cdの値は右図のように変化します。

「Carry(またはCy)」桁は加算の桁あふれと減算の桁借りを保持しています。「Ie」桁は「割り込み」の可能/不可能を設定します。

スタックポインタ「SP」はデータ用のメモリを「スタック」と呼ばれる格納方式として機能させるためにつかうレジスタです。レジスタの内容はデータ用メモリの2000番台のアドレスとして使います(頭に「20」を付けて使う)。スタックはプログラムの「入れ子構造」を実現するのに大変便利です。

スタックにデータを押し込む「プッシュ」をすると、SPで示したアドレスを一つ減少させてーすなわち空きを作ってーからそのアドレスのメモリにデータを書き込みます。逆にスタックか らデータを引き抜く「ポップ」をすると、SPで示したアドレスからデータを読み出してからそのアドレスを一つ増加させるー空きをつぶすーという動作をします。

サ ブルーチンへのジャンプ(「手続き呼び出し」や「関数呼び出し」のこと)は、PCの内容をスタックにプッシュしたのち飛び先にジャンプ(PCに飛び先アド レスをセット)し、サブルーチンからのリターン(戻り)はスタックからポップしてPCにセットするという動作をします。

ブロック図

各レジスタが相互にどのようにつながっているのか表した図がこれです。”Memory mapped I/O”なので、入出力は”Memory”の一部として特に書き分けていません。

「ALU」 や「+/-」と書いてあるVの字ような図形は演算回路といい、上部左右の口から供給される数値を何らかの演算を施して下部の出力から答えを得るものです。 命令により演算の種類を切り替えます。また、演算回路自体には記憶をする機能はなく、ALUの場合はアキュムレータ「A」に戻して記憶します。