MYマイコンを作る(2) 
   COMETUの命令の実行を考える


 MYマイコンを作る(1)で「ディジタル計算機は、ディジタルの型で表された数に対して、入力・出力・演算操作・順序操作をそれ自身の記憶装置に蓄えている一連の操作を行う」と述べました。この「記憶装置に蓄えている一連の操作」は、命令のかたまりでプログラムと呼ばれています。すなわち、それぞれの命令は、それぞれの演算操作・順序操作を持っています。

 「情報処理技術者試験 出題範囲」の「アセンブラ言語の仕様」で定めるCOMETUの仕様では命令の機能とレジスタ構成の説明はありますが、命令の機能を実現するための内部の動きや内部構成(ブロック図)の説明は有りません。命令を実行する内部の動きと内部構成(ブロック図)は、一体として同時に考えますが、命令の機能を実現する内部の動きをつかむために命令ごとに内部の動きを考えて見ましょう。

 ここでは、COMETUが扱う「2進数」「2の補数」「レジスタの機能」「命令の機能」‥の詳細な説明はいたしません。必要なら解説しているWEBや本‥をご利用ください。私は、次の本とWEBを参考にしています。
  ・アッセンブラ言語 CASLU   東田・山本・広瀬共著  出版:工学図書(株)
  ・アッセンブラ入門 CASLU   内田 著        出版:電子学園


このページを書いている間に考えたこと。 
COMETUの命令の内部動作をステップに分けて考えた。
 初期のこの段階では命令の動きと内部構造を同時に考えながら内部構造と命令の内部処理方法を纏めていきます。 しかし、私は一時に一つのことしか文章で表現することができないので、まず、命令の内部動作をステップに分けて記述します。
このページの「命令の内部動作をステップに分けて考えた」ことを、ここに纏めておきます。
しかし、このページの「命令の内部動作をステップに分けて考えた」ことは、内部構成(ブロック図)をぼんやりと考えて作ったので正確さに欠けるので、これから変更が多々生じます。



◆1語命令の内部動作を考える

●まず、NOP 命令の内部動作をステップに分けて考えます。

ステップ NOP 命令内部動作
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出してインストラクション レジスタ IR に設定する。
・命令を解析すると1語命令なので次ステップは命令の実行と判断する。
・プログラムレジスタ PRの内容を +1 する。
・インストラクションレジスタ IR の命令が NOP なので次の命令に進む。

 以上の様に、演算操作は「何もしない」「PRの内容を+1」になります。

●次に、LD r1,r2 命令の内部動作をステップに分けて考えます。

ステップ LD r1,r2 命令の内部動作
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出してインストラクション レジスタ IR に設定する。
・命令を解析すると1語命令なので次ステップは命令の実行と判断する。
・プログラムレジスタ PRの内容を +1 する。
・インストラクションレジスタ IR の命令が LD r1,r2 なので r2 が指定するレジスタの内容をそのまま r1 が指定するレジスタに設定。
・フラッグレジスタ FR に演算結果に従って設定する。
・次の命令に進む。

 以上の様に、演算操作は「そのまま 」「PRの内容を+1」になります。


●次に、ADDA r1,r2 命令の内部動作をステップに分けて考えます。

ステップ ADDA r1,r2 命令内部動作
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出してインストラクション レジスタ IR に設定する。
・命令を解析すると1語命令なので次ステップは命令の実行と判断する。
・プログラムレジスタ PRの内容を +1 する。
・インストラクションレジスタ IR の命令が ADDA r1,r2 なので r1 と r2 が指定するレジスタの内容を算術加算する。その結果を r1 が指定するレジスタに設定。
・フラッグレジスタ FR に演算結果に従って設定する。
・次の命令に進む。

 以上の様に、演算操作は「算術加算」「PRの内容を+1」になります

 ステップ2で「r1 と r2 が指定するレジスタの内容を算術加算する。その結果を r1 が指定するレジスタに設定」が1ステップで実行できるのか?と疑問が起きますが回路構成を考えるときに再度考えます。

●上記のNOP 命令とLD r1,r2 命令とADDA r1,r2 命令の内部動作の相違は、第2ステッの演算操作の処だけで順序操作は同じです。

 すなわち、
  順序操作は同じで、命令が指示する演算をすれば多くの命令が同じ手順で処理できます。


 これに該当する命令を次に示します。
  ・NOP
  ・LD r1,r2
  ・ADDA r1,r2
  ・SUBA r1,r2
  ・ADDL r1,r2
  ・SUBL r1,r2
  ・AND r1,r2
  ・OR r1,r2
  ・XOR r1,r2
  ・CPA r1,r2
  ・CPL r1,r2


◆LD r,adr,x命令と同様の命令の内部動作を考える

●まず、LD r,adr,x 命令の内部動作をステップに分けて考えます。

ステップ LD r,adr,x 命令内部動作
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出してインストラクションレジスタ IR に設定する。
・命令を解析すると2語命令なので次ステップは2語目の命令の読み出しと判断する。
・プログラムレジスタ PRの内容を +1 する。
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出して2語目のインストラクションレジスタ IR2 に設定する。
・命令を2語読み出したので次ステップは命令の実行と判断する。
・プログラムレジスタ PRの内容を +1 する。
・インストラクションレジスタ IR の命令が LD r,adr,x なので x が指定するレジスタの内容の値とadr を加算して実効アドレスを計算する。計算値は保持する。
・実効アドレスで指定するメモリのアドレスを読み出す。
メモリから読み出した実効アドレスの内容を r が指定するレジスタに設定する。
・フラッグレジスタ FR に実効アドレスの内容に従って設定する。

・次の命令に進む。

 以上の様に、演算操作は「そのまま 」「PRの内容を+1」「アドレスを加算」になります。

●次に、ADDA r,adr,x 命令の内部動作をステップに分けて考えます。

ステップ ADDA r,adr,x 命令の内部動作
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出してインストラクションレジスタ IR に設定する。
・命令を解析すると2語命令なので次ステップは2語目の命令の読み出しと判断する。
・プログラムレジスタ PRの内容を +1 する。
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出して2語目のインストラクションレジスタ IR2 に設定する。
・命令を2語読み出したので次ステップは命令の実行と判断する。
・プログラムレジスタ PRの内容を +1 する。
・インストラクションレジスタ IR の命令が ADDA r,adr,x なので x が指定するレジスタの内容の値とadr を加算して実効アドレスを計算する。計算値は保持するそ。
・実効アドレスで指定するメモリのアドレスを読み出す。
メモリから読み出した実効アドレスの内容と r が指定するレジスタの内容を算術加算する。その結果を r が指定するレジスタに設定する。
・フラッグレジスタ FR に演算結果に従って設定する。

・次の命令に進む。

 以上の様に、演算操作は算術加算」「PRの内容を+1」「アドレスを加算」になります。


●上記のLD r,adr,x 命令とADDA r,adr,x 命令の内部動作の相違は、第5ステッの演算操作の処だけで順序操作は同じです。

 すなわち、
  順序操作は同じで、命令が指示する演算をすれば多くの命令が同じ手順で処理できます。


 これに該当する命令を次に示します。
・LD r,adr,x
・ADDA r,adr,x
・SUBA r,adr,x
・ADDL r,adr,x
・SUBL r,adr,x
・AND r,adr,x
・OR r,adr,x
・XOR r,adr,x
・CPA r,adr,x
・CPL r,adr,x


◆ST r,adr,x 命令と同様の命令の内部動作を考える

ステップ ST r,adr,x 命令内部動作
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出してインストラクションレジスタ IR に設定する。
・命令を解析すると2語命令なので次ステップは2語目の命令の読み出しと判断する。
・プログラムレジスタ PRの内容を +1 する。
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出して2語目のインストラクションレジスタ IR2 に設定する。
・命令を2語読み出したので次ステップは命令の実行と判断する。
・プログラムレジスタ PRの内容を +1 する。
・インストラクションレジスタ IR の命令が LD r,adr,x なので x が指定するレジスタの内容の値とadr を加算して実効アドレスを計算する。計算値は保持する。
・r が指定するレジスタの内容を 実効アドレス が指定するメモリアドレスに書き込む。
・次の命令に進む。

 以上の様に、演算操作はそのまま」「PRの内容を+1」「アドレスを加算」になります。

 順序操作は同じで、演算操作が異なる命令は見当たりません。


◆LAD r,adr,x 命令と同様の命令の内部動作を考える

ステップ LAD r,adr,x 命令内部動作
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出してインストラクションレジスタ IR に設定する。
・命令を解析すると2語命令なので次ステップは2語目の命令の読み出しと判断する。
・プログラムレジスタ PRの内容を +1 する。
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出して2語目のインストラクションレジスタ IR2 に設定する。
・命令を2語読み出したので次ステップは命令の実行と判断する。
・プログラムレジスタ PRの内容を +1 する。
・インストラクションレジスタ IR の命令が LAD r,adr,x なので x が指定するレジスタの内容の値とadr を加算して実効アドレスを計算する。計算値は保持する。
・実効アドレスの値を r が指定するレジスタに設定する。
・次の命令に進む。

 以上の様に、演算操作は「そのまま」「PRの内容を+1」「アドレスを加算」になります。

 順序操作は同じで、演算操作が異なる命令は見当たりません。



◆SLA r,adr,x 命令と同様の命令の内部動作を考える

●SLA r,adr,x 命令の内部動作をステップに分けて考えます。

ステップ SLA r,adr,x 命令内部動作
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出してインストラクションレジスタ IR に設定する。
・命令を解析すると2語命令なので次ステップは2語目の命令の読み出しと判断する。
・プログラムレジスタ PRの内容を +1 する。
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出して2語目のインストラクションレジスタ IR2 に設定する。
・命令を2語読み出したので次ステップは命令の実行と判断する。
・プログラムレジスタ PRの内容を +1 する。
・インストラクションレジスタ IR の命令が SLA r,adr,x なので x が指定するレジスタの内容の値とadr を加算して実効アドレスを計算する。計算値は保持する。
・r が指定するレジスタの内容を実効アドレスの下4ビットの値だけ算術左シフトする。
・フラッグレジスタ FR にシフト結果に従って設定する。
・次の命令に進む。

 以上の様に、、演算操作は「算術左シフト」「PRの内容を+1」「アドレスを加算」になります。

  指定シフト回数を1ステップで処理するとシフト回路のハードウエア規模が大きくなる。又、シフト回路をシフトレジスタで構成するとハードウエア規模は小さいが、演算ステップが指定シフト数必要になる。ここでは、1ステップでシフト演算が完了するとして、回路構成を考えるときに再度考えます。

順序操作は同じで、命令によってシフト動作が異なる命令を次に示します。
・SLA r,adr,x
・SRA r,adr,x
・SLL r,adr,x
・SRL r,adr,x


◆JMI adr,x 命令と同様の命令の内部動作を考える

ステップ JMI adr,x 命令内部動作
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出してインストラクションレジスタ IR に設定する。
・命令を解析すると2語命令なので次ステップは2語目の命令の読み出しと判断する。
・プログラムレジスタ PRの内容を +1 する。
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出して2語目のインストラクションレジスタ IR2 に設定する。
・命令を2語読み出したので次ステップは命令の実行と判断する。
・プログラムレジスタ PRの内容を +1 する。
・インストラクションレジスタ IR の命令が JMI adr,x なので x が指定するレジスタの内容の値とadr を加算して実効アドレスを計算する。計算値は保持する。
・フラッグレジスタ FR のSFが 1 の場合、実効アドレスをプログラムレジスタ PRに設定する。
・次の命令に進む。

 以上の様に、演算操作は「フラッグレジスタ FR の判定」「PRの内容を+1」「アドレスを加算」になります。

順序操作は同じで、命令によって判定条件が異なる命令を次に示します。
・JMI adr,x
・JNZ adr,x
・JZE adr,x
・JUMP adr,x
・JPL adr,x
・JOV adr,x


◆PUSH adr,x 命令の命令の内部動作を考える

ステップ PUSH adr,x 命令内部動作
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出してインストラクションレジスタ IR に設定する。
・命令を解析すると2語命令なので次ステップは2語目の命令の読み出しと判断する。
・プログラムレジスタ PRの内容を +1 する。
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出して2語目のインストラクションレジスタ IR2 に設定する。
・命令を2語読み出したので次ステップは命令の実行と判断する。
・プログラムレジスタ PRの内容を +1 する。
・インストラクションレジスタ IR の命令が PUSH adr,x なので x が指定するレジスタの内容の値とadr を加算して実効アドレスを計算する。計算値は保持する。
・スタックポインタ SPの内容 を −1 する。
実効アドレスの値をスタックポインタ SP の内容の値をアドレスとしてメモリに書き込む。
・次の命令に進む。

 以上の様に、演算操作は「PRの内容を+1」「アドレスを加算」「SPの内容を −1」になります。

◆POP r 命令の命令の内部動作を考える

ステップ POP r 命令内部動作
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出してインストラクション レジスタ IR に設定する。
・命令を解析すると1語命令なので次ステップは命令の実行と判断する。
・プログラムレジスタ PRの内容を +1 する。
スタックポインタ SP の内容の値をアドレスとしてメモリから読み出し、r が指定するレジスタに設定する。
・スタックポインタ SP の内容 を +1 する。
・次の命令に進む。

 以上の様に、順序操作は「そのまま」「PRの内容を+1」「SPの内容を +1」になります。

◆CALL adr,x 命令と同様の命令の内部動作を考える

ステップ CALL adr,x 命令内部動作
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出してインストラクションレジスタ IR に設定する。
・命令を解析すると2語命令なので次ステップは2語目の命令の読み出しと判断する。
・プログラムレジスタ PRの内容を +1 する。
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出して2語目のインストラクションレジスタ IR2 に設定する。
・命令を2語読み出したので次ステップは命令の実行と判断する。
・プログラムレジスタ PRの内容を +1 する。
・インストラクションレジスタ IR の命令が CALL adr,x なので x が指定するレジスタの内容の値とadr を加算して実効アドレスを計算する。計算値は保持する。
・スタックポインタ SPの内容 を −1 する。
・プログラムレジスタ PR の内容をスタックポインタ SP の内容の値をアドレスとしてメモリに書き込む。
・実効アドレスの値ををプログラムレジスタ PRに設定する。
・次の命令に進む。

 以上の様に、演算操作は「そのまま」「PRの内容を+1」「アドレスを加算」「SPの内容を −1」になります。

◆RET 命令の命令の内部動作を考える

●まず、RET 命令の内部動作をステップに分けて考えます。

ステップ RET 命令内部動作
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出してインストラクション レジスタ IR に設定する。
・命令を解析すると1語命令なので次ステップは命令の実行と判断する。
・プログラムレジスタ PRの内容を +1 する。
・スタックポインタ SP の内容をアドレスとしてメモリから読み出しプログラムレジスタ PRに設定する。
・スタックポインタ SP の内容 を +1 する。
・次の命令に進む。

 以上の様に、演算操作は「そのまま」「PRの内容を+1」「SPの内容を+1」になります。

◆SVC adr,x 命令の命令の内部動作を考える

●まず、SVC adr,x 命令の内部動作をステップに分けて考えます。

ステップ SVC adr,x 命令内部動作
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出してインストラクションレジスタ IR に設定する。
・命令を解析すると2語命令なので次ステップは2語目の命令の読み出しと判断する。
・プログラムレジスタ PRの内容を +1 する。
・プログラムレジスタ PR の内容をアドレスとしてメモリから命令を読み出して2語目のインストラクションレジスタ IR2 に設定する。
・命令を2語読み出したので次ステップは命令の実行と判断する。
・プログラムレジスタ PRの内容を +1 する。
・インストラクションレジスタ IR の命令が SVC adr,x なので x が指定するレジスタの内容の値とadr を加算して実効アドレスを計算する。計算値は保持する。
・実効アドレスを引数として割出しを行う。
・次の命令に進む。

 以上の様に、演算操作は「PRの内容を+1」「アドレスを加算」になります。




ホームへ戻る