2008年11月27日木曜日

試験にでる英単語

久々のカタストロフ。
知識の崩壊と
メモリの残らない裸の王様。

キタキツネの鳴き声は、いまだかつて内董卓打倒の切り札として、この世の全てを包含したまま、この世を去ってしまった。飛び出せ青春とはならず、ここでこそ、意志の上にも三年。これが大切なのだ。

彼女を置き去りにしたまま旅を続けることは不可能かつ望むわけもないことであり。
切なる希望を言うとすれば、ただ、安穏と平安のうちに事が進み、次世代を思いながら去ることができるならばこれに越したことはない。

しかし、世の中そう甘くもないわけであり。
ひとつ気を引き締めて、何事にもかかる必要があるに違いない。

これからのことを思うと、多くの苦難しか想像できないわけであるが、それでもしばしの休息とねぎらいの時には、新たな発見と喜びと、そして愛情が存在することを祈る。

さて、ここまでの流れを整理しておこう。

レジスタにはAF、BC、DE、HL、IX、IYがあり、これにメモリをあわせたものが一時記憶領域として利用できる。このうちAはアキュレーションレジスタと呼ばれ、操作することができるのはこのレジスタのみである。つまり、データの格納以外のことは、他のレジスタにはできない。
Fはフラグレジスタと呼ばれ、Aレジスタに対して行った操作によって、変化するフラグが格納される場所である。Fにも8ビットの領域がある。詳細は次に繋ぐ。

メモリには16ビットのアドレスがあり、アドレスを指定することで、そのアドレスに8ビット(1バイト)の情報を格納することが可能である。

現在作成中のプログラムは、ソート処理を行うもので、起動時のパラメータとしてカンマ区切りで渡された数値を昇順でソートして表示するというもの。

最初につくったのは入力値をそのまま出力するという簡単なプログラムだった。

しかし、この段階で、ORG、CALL、RET、LD、CP、JP、ラベル、条件分岐などの基本的な操作をすべて使用することができた。このため、プロジェクトは速やかに終了するように思われたのであるが、ここからが問題山積みとなったのだ。

まず、命令にパラメータを渡す場合には、そのまま渡す場合と、括弧()をつけて渡す場合の二種類あり、そのまま渡すと、格納されている値がそのまま渡され、括弧つきだと格納されている値が指し示すアドレスに格納されている値が渡されることになる。つまり参照になるということ。

それから、処理中のコードは全てメモリに保管されている。これは当たり前のことなのだけれど、Javaを使っているとメモリの管理をそこまで意識することはないので、わかりづらいことが多い。たとえば、ORG命令によって、プログラム開始アドレスを指定したとして、次に続く一行は当然開始アドレスの次のアドレスを確保することになるのだろうけど、それが何バイト必要とする命令なのかは判らない。とここまで書いて思ったのだけれど、マシン後の対応表を見ればそれがわかるのかな。ほとんどの命令は、命令で1バイトパラメータ毎に、1バイト使用しているようなので、多くても3バイト程度の命令しかないのかもしれない。とはいえ、自由に使用できるめもり領域がどこからなのか、一見してわからないのはやはり厄介で、今回の場合には、入力値を格納する領域、入力値の格納されているアドレスを格納する領域、それぞれの入力値の桁数を格納する領域、入力値の数を格納する領域をそれぞれ準備する必要があったのだが、それを準備するアドレスをどこにするのか、これがもし、大きなプログラムであれば、プログラムのサイズによって、変化してくることになり、最終的に書いてみたら入りませんといったことも起こりえるではないか。という不安が頭をよぎった。

それから、PUSHとPOPはレジスタの情報を一時的に退避してくれる便利な命令だと思っていたのだけれど、復帰させる順番を間違えると、ちがう情報が帰ってきてしまうということも盲点だった。そもそもこれらの命令は、呼ばれるたびに保管場所を準備して、数珠繋ぎにデータを保管しているので、レジスタとリンクしているわけではないということなのだ。これは気をつけなければならないポイント。

Javaでのデバッグに慣れている自分としては、動かしながらつくるのが当然のことになってしまっていたが、処理の全体像を描けなければ、つくるのは難しい。これまでとは違った発想と丁寧さが必要になってくることは間違いない。さてどうしたものか。いまはフローチャートを作成しつつつくっていくことで、なんとか頭の整理を保っているけれども、この方法が一番良いのかどうかはわからない。

自分が作ろうとしているアルゴリズムをきちんと理解することがもっとも重要なことだと思われる。
そうしなければ、自分のコードが正しいのかどうかですらまったく判らないという状況に陥ってしまうことは請け合いである。

スティーブジョブズはイノベーションの方法を体系化することは、痛々しい努力だと言っていたけれど、自分としては何もないでは考えられないではないかと思ってしまう。それが、自分のなかだけの体系だとしても。。。

0 件のコメント: