標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第543回]

●FOR NEXTのデバッグの続きです

前回は実数型変数(実数型定数も同じ)の構造について簡単にですが説明をしましたので、FOR NEXTのデバッグの説明を続けることにいたします。

前々回([第541回])の終わりのところで以下のように説明をしました。

アドレス25AC〜25B2では、 FOR A=0 TO 10 という命令文の TO 10 のところを計算して、FTOレジスタに数値10を保存します。


上の画面は[第541回]でお見せしたものと同じです。
アドレス25ACでは数式を計算するサブルーチンCALCをコールしています。
数値の10を計算するためです。

数式を計算するサブルーチンとしては、[第541回]で、LETSを紹介いたしました。
LETSはA=B+Cのように、右辺の式を計算してその結果を左辺の変数に代入します。
これに対してCALCは数式を計算しますが、その結果は演算レジスタFACCに保持するだけで、変数に代入するところまでは行いません。

話が複雑になりますから、ここでは深くは説明しませんが、浮動小数点計算を行うには、前回説明しました実数型の構造そのままではちょっと計算がやりにくいので、それを計算するためのレジスタ、FACCおよびFBCCに計算をし易い形に展開して格納します。
その作業をアンパックといい、UAPKサブルーチンをコールします。

逆にCALCなどの計算ルーチンによって計算を終わった結果をFACCから変数アドレスに書き込む作業は、パックといいます。
その作業はAPKサブルーチンをコールします。

TOレジスタFTOはFOR NEXTループのカウンタ変数(このテストプログラムではA)の終了値を保持します。
このテストプログラムではその値は10です。
この10も、実数型に変換してからFTOのエリアに格納されます。
FTOのアドレスはF0F1〜F0F4の4バイトです。
ここには前に実行したプログラムによって既に値が書き込まれていますから、それをクリアしておくために、FFを書き込んでいます。

そうしておいてから、25b8にブレイクポイントをセットして、rtコマンドを実行しました。
これでアドレス25b2のCALL APKが実行されて、さきほどCALL CALCで計算して得た10の実数値がFTOに書き込まれたはずです。

そのあと、DMコマンドでF0F1〜F0F4の値を確認しています。
さきほどrtコマンドの実行前はFF FF FF FFにしてあったところが、00 00 50 04に書き換わっています。
メモリの並びはデータの下位バイト〜上位バイトの順になっていますので、これを上位バイト〜下位バイトの順に直してみます。
04 50 00 00になります。
04は指数部です。
です。
50 00 00は仮数部ですが、下位2バイトは0ですので、それは省略して上位バイトのみを2進数表現で示してみます。
01010000
になります。

左の0と次の1との間に小数点があることになっていますから、するとその最初の1は10進数の値として考えると1/2になります。
えええ?なぜえ?

小数点以下第1位に1があったら、もしも10進数ならば1/10ですよね。
2進数ですから、1/2なのです。1×2−1です。
同じように考えると、そのひとつおいて下位にある2番目の1は、
1/8になります。1×2−3です。

そういうことですから、上の仮数部の値を10進数に直すと、
0.5+0.125=0.625になります。
指数部は 2でしたから、
0.625×2という値になります。
0.625×16=10になりますから、確かにFTOには10が入っていることになります。

この説明はちょっとわかりにくかったかもしれません。
2進数と10進数がごちゃまぜに登場しているからです。
2進数だけで考えた方がわかりやすいかもしれません。

小数点以下に1010000…という数がありますから、それを
0.101000…のように小数点をつけて表してみます(10進数のようですがあくまで2進数として考えてください)。
そしてその大きさを示す指数部は 2ですから、すると、
0.101に2を4回掛けたものと同じ値であると考えることができます。

2を掛けるということは、2進数では値全体をを左に1桁シフトするのと同じですから、1回ずつ2を掛けて(つまり左にシフトしながら)同時に指数の値を−1していくと、下のようになります。
0.101×2(この後ろの2のところだけは10進数ですねえ)
1.01×2
10.1×2
101.0×2
1010

2進数の1010は10進数に直すと10ですから、上のFTOに入れられた値は確かに実数型の10という値だということがわかります(わかりましたでしょうか?)。
2010.7.5upload

前へ
次へ
ホームページトップへ戻る