「天文屋のためのマイコン入門」演算命令の設計
やっとマルツパーツから、部品が届きました。そして早速LEDをつけて光らせることに成功しました。明日には記事にできると思います。まだ記事の編集をしているところなので、今日のところは命令設計の話しを続けます。、
さてそれでは、演算命令を設計してみたいと思います。マイコンでいうところの演算とは、算術演算と論理演算があります。まずは算術演算です。次のものがあります。
●加算
●減算
●符号反転
掛け算、割り算はないの?と思われるかもしれません。これらの演算はハードにとって負担が大きいので、PICのような小規模なマイコンにはないのが普通です。必要なときは他の演算を駆使してフトウェアで実現するか、そもそも乗除算を必要としないアルゴリズムを考えます。
符号反転は絶対値は等しく、マイナスをプラスにプラスをマイナスにしますが、0からの減算で代用できるので、なくてもかまいません(よってPICにはない)
さて、論理演算には次のようなものがあります。
●論理和
●論理積
●排他的論理和
●反転
これらについては、ここでの説明は省略します。必要なときに説明します。
さて、例として、加算の命令を設計してみたいと思います。2つのデータを加算して、データメモリやレジスタに格納することを次のような記号で表します。
●A + B → C
A、B、Cがそれぞれ別なものの場合、これを三番地形式といいます。これをそのまま命令とするのは、命令コストが、かかるのが容易に想像できます。したがって、三番地形式はあまり小型のマイコンでは採用されていません。(PowerPCとか一部のマイコン)
また三番地形式は演算のたびに新たな格納領域を必要とするのでたくさんのレジスタやメモリを必要とします。
それでは普通のマイコンは演算で、どのような形式をとっているのでしょうか。それは次のようなものです。
●A + B → A
or
●A + B -> B
つまり、演算の結果を元のデータが入っていた場所のどちらかに再格納します。これは、演算のたびに新たな格納領域を必要としません。
ただし、格納先に選ばれた領域のデータは新たなデータに上書きされてしまいます。
上書きされることは不便な場合もありますが、むしろその方が好都合な場合があります。
たとえば、これから、インタバールシャッターのプログラムを作りますが、当然、残り時間とか撮影枚数のデータを保持しているはすです。それは常に更新されており、更新前のデータを覚えておく必要はありません。次々と上書きされていくほうがむしろ自然です。
さて、演算の基本形式が決まったところで、具体的な命令を設計しましょう。転送の場合と同じく、出てくるのものは次の3つです。
W ワーキングレジスタ
F データメモリ
L 数値
●A + B → AまたはB
にW F Lの可能なすべての組み合わせを入れてみます。ただし、L数値は格納先にはなりませんので、それは除外します。
さて、加算ですが、加算は順序を入れ替えても良いので(可換)たとえば、
W + F
F + W
は同じことです。これを考慮すると上記は
に絞られます。
ここで、転送命令のときと同じように命令コストを計算します。
W+F->FはFが2つ出てくるので、コスト2では?と思いますが、A+B->Bの形式で2つのFは同じ番地なので、コストは1です。
ここで、コスト2は許されませんので、除外します。(転送命令では同じ番地の転送は例外でOKでしたが、演算命令ではこの特例はないようです。あっても良いと思うのですが、、、)
そうすると、加算命令で許されるのは次の3つです。
次に実際に命令にしてみます。加算なので、ADDという記号を借りて、対象物の記号WとかLを語尾につけます。
1と2が同じになってしまいました。しかし、これらは第二付帯情報で区別することにします。第一付帯情報は、Fの場合は番地f、Lの場合は数値kでしたね。これらをつけると、以以下のようになります。
これで加算の命令が完成です。
次回は、加算以外の演算命令を説明します。
| 固定リンク
コメント