ぽけもんとか。

プログラムを分解しよう!


百聞は一見に如かず!

基礎編、命令編の知識を用いて早速プログラムを作ってみるのも良いのですが…まずは実際に使用できるプログラムに触れ、実践的な知識を身につけましょう。
さて、ここにやってきたあなたは「てヨめのの」「てウんのの」といった文字列からなるプログラムを知っているはず。手始めにこれを解体します。

上記は手持ち1匹目のポケモンのNN2文字目を"E"に変更するプログラムです。 文字コードリスト を元に分解してみましょう。なお、ポケモンのNNの後には必ず終止符(50)が入力されるので、これを加味します。 これが命令編で少しだけ触れた「機械語」です。
このままだとよくわからないので、ニモニックを元に… <リンク1> <リンク2> <リンク3> 分かりやすく清書します(逆アセンブル)。なお、当プログラムに関係のないものは灰色で表示しています。 はい、これで馴染みのある形になりました。では、復習を兼ねて今度は こちら を参照し、それぞれがどのような働きを持っているのか、ならびにレジスタがどう変動するか調べてみましょう。

ld c,85

cレジスタに85を入れます。

c=85

swap c

cレジスタの上位4bitと下位4bitを入れ換えます。

c=58

ld b,D2

bレジスタにD2を入れます。

b=D2 c=58

push bc

bcレジスタをspに格納します。

sp=D258

pop hl

spをhlレジスタに格納します。

h=D2 l=58

ld a,32

aレジスタに32を入れます。

a=32 h=D2 l=58

add a

a+aの計算結果をaレジスタに格納します。

a=64 h=D2 l=58

ldd (hl),a

hl座標、すなわち座標D258にaレジスタの値を入れます。その後、hlレジスタの値を-1します。

(D258)=64

ret

spを参照してサブルーチンから戻ります。すなわち、一連のプログラムの終点です。

結果

要点をまとめると、このプログラムは「レジスタを駆使して"D258"という文字列をつくり、これが指定する座標に"64"を入れる」という作業を行っていると言えます。わりと単純でしょ?
このように、最初のうちは他の人が作ったプログラムについて、どの値の変更を求めているのか、より最適化できないか、といったことを考えつつ中身を見てみると良いでしょう。
なお、アイテム欄を使ったプログラムについても同様に逆アセンブルできます。その際には こちら を参照してください。
ちなみに、なぜこのような回りくどいやり方をしているのかというと、先ほどご覧いただいた「文字コードリスト」や「どうぐリスト」において対応している命令が限られているからです。


メモリ構造

ここまで記事をご覧いただいて、このように思いませんでしたか?
( ˘ω˘)。o〇 (任意座標の値を変更するって言っても、どこがどれに対応してるのかわからないし…まさか、事前にいちいち解析して調べなきゃいけないの?)
結論から言うと、そんなことはありません。有志の方々がすでにメモリの構造体を解析しています。以下はその一例です。
れんだ様 thfan様
また、こちらは海外版に向けたものですが、ある程度の目安にもなります。


おわりに

いかがでしたか?「意外とかんたんだな〜」と思った方も、「やっぱりプログラミングって難しい!」という方もいらっしゃるかと思いますが、共通して言えるのは「プログラムに触れることが重要」だということです。
他の方が作ったプログラムを改良したり、はたまた自分で作ってみたりとやり方は様々です。
いろいろなプログラムに触れ、わからない命令文が出てきたら ここ を参考にして、テクニックをどんどん盗んでしまいましょう!

…あと、ポケモンとは関係ないのですが、ネットサーフィンしていて見つけた このページがなかなか面白かったので、ご紹介させていただきます。ぜひ参考になさってください。
ちなみに、リンク先のレポート課題の解答例は、CP a,80です。



←命令編
戻る