課題

以下の課題問題を解き、レポートとして提出せよ。

課題1. マイクロプログラムの例題を実行する

配布した教科書(「マイクロプログラミング」)中の例4.1から例4.7の マイクロプログラムを、マイクロプログラムアセンブラを使用してアセンブル &シミュレートを行ない、ハードウェアの動作を理解する。
マイクロプログラムのアセンブリソースコードは このページに置いてあるものを使用する。
(プログラムのソースコードを自分で入力する必要はない)

動作を確認するためにトレース実行中に表示すべきデバイス名を考えて、 そのデバイスの値の変化を調べ、各プログラムがどのように動作しているかを 説明せよ。
(シミュレータへの入力内容と実行結果も示すこと)

※ 課題1.の例題番号は ((学籍番号の下2桁 + 4) mod 7) + 1 とする。
例えば、t102995の場合は、((95 + 4) mod 7) + 1 == 2 なので、例4.2の マイクロプログラムを実行する。

課題2. アセンブリ言語プログラムの例題を実行する

配布した教科書中の例5.2から例5.4のプログラムを、機械語のアセンブラを 使用してアセンブル&シミュレートを行なう。
機械語プログラムのアセンブリソースコードは このページに置いてあるものを使用する。
(プログラムのソースコードを自分で入力する必要はない)

課題1と同様に、 動作を確認するためにトレース実行中に表示すべきデバイス名を考えて、 そのデバイスの値の変化を調べ、各プログラムがどのように動作しているかを 説明せよ。
(シミュレータへの入力内容と実行結果も示すこと)

※ 課題2.の例題番号は ((学籍番号の下2桁 + 4) mod 3) + 2 とする。
例えば、t102995の場合は、((95 + 4) mod 3) + 2 == 2 なので、例5.2の 機械語プログラムを実行する。


課題1および課題2での注意点

課題3. MICRO-1機械命令を用いて機械語プログラム作成する

以下のアルゴリズムの中から一つ以上を選び、MICRO-1機械命令を用いて 機械語プログラム記述し、実行をシミュレートする。 アセンブリコードとシミュレータへの入力内容、および実行結果を示すこと。
実行結果については入力データを最低でも3通り変えて動作確認を行うこと。
また、各プログラムの最終的な計算結果を必ずメモリに書き込んで終了する ようにプログラムを作ること。

  1. 2つの4次元ベクトルの内積の値を求める
    ただし、ベクトルの各要素は整数とし、主記憶(MM)上にあらかじめ 配置しておくものとする。
    (各要素の値を最初からレジスタに設定しておくのではなく、必ず主記憶から 読み出すこと)

    ※ベクトルの各要素を正の値、負の値、0にするなど入力データをいろいろ 変えて動作確認を行うこと。

  2. 2つの正整数M, Nの最大公約数を求める
    ユークリッドの互除法を用いること。
    ユークリッドの互除法
    
    1. MをNで除算した結果の余りを Rとする
    2. R≠0 ならば 3aへ。R=0 ならば 3bへ。
    3a. M := N、 N := Rとして 1へ。
    3b. Nの値が最大公約数となる。
    
    ※片方の値が0の場合や負の値を与えた場合の動作についても確認すること。

  3. N番目のフィボナッチ数を求める
    fib(1) = 1; fib(2) = 1;
    fib(n) = fib(n-1) + fib(n-2);
    
    ※nの値が0の場合や、極端に大きい値の場合の動作についても確認すること。

  4. 入力した年号(西暦)が閏年であるかどうかを判定する
    ただし、年号(西暦)は主記憶(MM)上にあらかじめ配置しておくものとする。
    閏年の判定は以下の通りとなる。
    4の倍数は閏年
    ただし、100の倍数は平年とし、400の倍数は閏年とする
    
    例:西暦1900年は平年、2000年は閏年、2001年は平年、2012年は閏年、2100年は平年、2400年は閏年
    

  5. 主記憶上に配置されている2つの配列データの内容が一致するかどうか を判定する
    2 7 1 8 2 8 1 8 2 8 4 5 9 0 4 5 2 3 5 3   (配列A)
    2 7 1 8 2 8 1 8 2 8 4 5 9 0 4 5 2 3 5 3   (配列B)
                       ↓
    一致する場合は主記憶上に判定結果として FFFFを格納する。
    

    2 7 1 8 2 8 1 8 2 8 4 5 9 0 4 5 2 3 5 3   (配列A)
    2 7 1 8 9 8 1 8 2 8 4 5 9 0 4 5 2 3 5 3   (配列B)
                       ↓
    一致しない場合はデータが異なる位置を主記憶上に格納する。
    先頭からのオフセット値(先頭を0とする)を格納すること。(この例の場合は0004)
    
    ※最低でも長さ10以上の配列データを使って動作確認をした実行結果を示すこと。
    先頭のデータが異なる場合、最後尾のデータが異なる場合、中央付近のデータが 異なる場合、データがすべて一致する場合、の最低でも4つの場合について 動作確認を行うこと。

  6. 2つの整数M,Nの順列数MPNを求める

  7. 2つの整数M,Nの組み合わせ数MCNを求める


課題3での注意点

課題4. 課題3で作成したプログラムのマイクロプログラム版を作成し、 両者を比較する

課題3で作成したMICRO-1の機械語プログラムをマイクロ命令を用いて作成し、 実行をシミュレートする。
機械語プログラムとマイクロプログラムのそれぞれの実行ステップ数等を比較し、 考察する。 どちらの実行ステップ数が少ないか? (つまり早くプログラムの実行が終了するのはどちらか?)、 何故そうなるのか?を必ず説明すること。
(アセンブリコードとシミュレータへの入力内容、および実行結果も示すこと)


課題4での注意点

課題5. マイクロプログラムを変更してMICRO-1機械命令の拡張を行う

機械命令を使った最大値を求めるプログラムを題材にして、 マイクロプログラム 'MICROONE'の変更によって機械命令を拡張すること を考える。

上記プログラムは ラベル DATAから並んだ16個のデータの中から最大値を見つけ出すプログラムである。
計算結果(つまり最大値)をラベルRESULTの場所に格納する。

このプログラムにおいて、ループ処理により検索処理を行っている部分を 機械命令化することで、実行サイクル数が少なくすることができると考えられるので、 MICRO-1機械命令マイクロプログラム 'MICROONE'を元にして 検索処理命令を追加する。

追加する命令を機械語プログラムから使用する際には、EX命令を使う。 機械語プログラム中でEX命令を使う場合は、I型命令と同様の表記をする。

EX 1,16(2)    ; (Ra部=2, Rb部=1, ND部=16)
MICRO-1に追加する「最大値を求める命令」は Raで指定したレジスタにデータの先頭アドレス、NDにデータの個数を設定すると、 データを検索し、その最大値を求める。 求めた最大値を Rbで指定したレジスタに格納する。

最大値を求める命令を使った場合の機械語プログラムでは 元のプログラムのループ処理(データカウント処理部分)を1つの機械命令(EX命令)に 置き換えている。
このプログラムと 命令追加の変更を行った 'MICROONE'を組み合わせて実行する。

'MICROONE'中でEX命令を処理している部分を変更することで、最大値を求める追加命令を実現し、 シミュレータ上で実行せよ。
検索対象データの値(ラベル DATA以降に格納されている値)を変えて、 それぞれについて動作確認を行うこと。
また、課題4と同様に、元のプログラム(maxval)と実行ステップ数を比較して、 考察せよ。
実行ステップ数がどう変わったか?何故そうなるのか?を必ず説明すること。

注意1
'MICROONE'を修正するとその実行開始アドレス(デフォルトは101)も変わるため、 機械語プログラムを実行するときに指定する開始アドレスに注意する。 変更後の'MICROONE'の実行開始アドレスを調べるためには、 'MICROONE.M'の中身を調べてラベルINITのアドレス値を調べるとよい。
例えば、ラベルINITのアドレス値が 10Cであった場合は、マイクロプ ログラムの実行開始アドレスも 10Cにすること。
※マイクロプログラム中の命令を追加あるいは削除した場合、このアドレス値も変化 するため、毎回確認すること。

注意2
マイクロプログラム 'MICROONE'の中ではレジスタの6番と7番はそれぞれ サブルーチン呼び出し時の戻り先PC記録用のスタックポインタ、PUSH/POP命令で レジスタ値の保存用のスタックポインタとして使われているため、値を勝手に 変更すると不具合を生じる。
またレジスタ0番から3番は機械語プログラムでも使用されるため、 これらのレジスタについても値を勝手に変更すると機械語プログラムが 正しく動作しなくなる。

もしこれらのレジスタを使いたい場合は、一旦レジスタの値をメモリ上に保存してから 使用すること。 また、レジスタを使用し終わったら、メモリ上に保存しておいた値をセットして 元の状態に戻すこと。

レジスタ4番と5番については自由に使うことができる。
レジスタ4番には命令レジスタIRのND部の値が格納されているので、必要に応じて この値を使用することが出来る。

ヒント
'MICROONE'内の(ファイルの最後の方にある)ラベル EX0辺りから EX命令用のマイクロ命令を記述すればよい。
処理の内容としては以下のようなことを記述すればよいと考えられる。
※番号のついた各項目がそれぞれ一つのマイクロ命令に対応している。

1. レジスタ4番(=命令レジスタND部の値が格納されている)の値をカウンタCにセット
2. もしカウンタCが0ならば(データが0個なので)ラベルEX3へ分岐
  同時にレジスタRAの値をレジスタ5番にセット
3. メモリ読み出しサイクル開始
  同時にレジスタ5番の値を+1し、カウンタCの値を1減らす
4. もしカウンタCが0ならば(データが0個なので)ラベルEX3へ分岐
  同時にメモリから読み出した値をレジスタRBにセット
EX1:
5. メモリ読み出しサイクル開始
  同時にレジスタ5番の値を+1し、カウンタCの値を1減らす
6. メモリから読み出した値をレジスタ4番にセット
7. レジスタ4番の値とレジスタRBの値を比較
8. 比較結果がレジスタ4番の値がレジスタRBより小である場合ラベルEX2へ分岐
9. (最大値を更新するため)レジスタ4番の値をレジスタRBにセット    ※常にレジスタRBに最大値が格納されるようにする
EX2:
10. もしカウンタCの値が0であれば(すべて調べ終わったので)ラベルEX3へ分岐
11. ラベルEX1へ分岐(ループの先頭に戻る)
EX3:
12. (これで命令の実行が終了なので)命令サイクルの最初に戻る
※上記とは別のやり方で求めても構わない。

2012/5/7追記
ヒントにおける注意点

課題6. MICRO-1機械命令を拡張する (オプション)

課題5を参考にして、MICRO-1に独自の命令を追加する。 (命令追加用に EX命令を使用すること)
また、追加した独自命令を利用した機械語プログラムを作成し、 組み合わせて実行することで動作確認を行う。

例えば、 メモリ上に配置された配列データの総和を求める命令、 2つのレジスタの最大公約数を求める命令、 主記憶上に配置したデータの先頭アドレスとサイズをレジスタオペランドとして 渡すと指定された領域を特定の値でクリアする命令、 データを暗号化する命令、 主記憶上に置いたデータをマイクロプログラムとみなして制御記憶に 読み込ませることで機械語プログラムからマイクロプログラムを書き換える命令、 等が考えられる。

また、課題2で使ったプログラムや課題3で作ったプログラムの一部の処理を 機械命令化するのでもよい。


文責:大津