2.2. 逆アセンブラー

2.2.1. DisPel
2.2.1.1. サンプル
[注記] 注記

本節は特に陳腐化してはいないのだが、補足しておく:

  • 逆アセンブラーを使いこなそう
  • 特にスーパーファミコンの作品については逆アセンブラーを自作しよう

ここでは逆アセンブラーツールをごく簡単に紹介する。 逆アセンブラーのプログラミングは CPU の仕様書があれば可能であるため、 既に気合いの入ったマニアの手により、いくつかの逆アセンブルツールが開発・配布されている。 後発の解析人としては、そのツールを再利用するのがよい。

2.2.1. DisPel

[注意] 注意

本書のダンプコードおよび本セクションの記述は、 いずれもバージョン 0.99 の DisPel に準拠している。 DisPel の最新版のソースコードが下記のサイトから入手可能だが、 ニーモニックが小文字で出力されるように変更されていたり、 -n コマンドラインオプションの仕様が変更されていたりするので、 自分で DisPel をビルドして利用している読者は混乱せぬよう留意されたい。

pelrun/Dispel - GitHub

図 2.5 DisPel

DisPel

65816/SMC 逆アセンブラー。 DisPel はコンソールアプリである。 すなわち、ROM イメージファイルを引数にとり、 アセンブリーコードをテキスト形式で出力するプログラムである。 アセンブリーと聞いても何のことやらさっぱりだというのであれば、計算機の基礎知識から勉強するハメになる。

解析道の先人は、外国のサイトから 65816 に関する文書を検索して、 言語仕様を把握してから解析に着手したという――。

DisPel の特徴は以下のとおり。

  • アドレス指定による逆アセンブル範囲の指定。バンク丸ごとも可能

  • REP/SEP 命令を意識した逆アセンブル

  • バンク境界の適切な処理

  • 自動で HiROM/LoROM を判断する

  • 「本物」の SNES アドレッシング

2.2.1.1. サンプル

DisPel を逆アセンブラーとして使うことを決めたならば、 環境変数 PATH に含まれている適当なフォルダに実行ファイル DisPel.exe を移動することになる。 ここまではエクスプローラで簡単にできる。 しかし、コードの出力をするにはコマンドプロンプトウィンドウを開く必要がある。 ただし Windows の cmd では逆アセンブリー処理以降のことが何もできないので 2.3 Cygwin で説明する環境で作業する。 それを開いたら、SFC 版ドラクエ 3 の ROM イメージファイル(ここでは sfcdq3.smc とする)のあるフォルダに移動して、 例えば以下のように入力すると、バンク $C3 の逆アセンブリーコードを得ることになる。 ちなみに実際はこの領域はプログラムではなく、ウィンドウ関連のデータ定義域なので、以下の出力は無意味だ。

$ dispel -n -h -s -b C3 -p sfcdq3.smc
C3/0000:	2184    	AND ($84,X)
C3/0002:	50C0    	BVC $FFC4
C3/0004:	200000  	JSR $0000
C3/0007:	0000    	BRK #$00
C3/0009:	5562    	EOR $62,X
C3/000B:	00AA    	BRK #$AA
C3/000D:	B052    	BCS $0061
C3/000F:	8020    	BRA $0031
C3/0011:	0000    	BRK #$00
C3/0013:	0000    	BRK #$00
…

上記の例では DisPel の自動判定機能に頼らず、明示的にオプションを指示した。 SFC 版ドラクエ 3 と SFC 版ドラクエ 6 はメモリーマッピングが同じ (HiROM, FastROM) である。 ともに -h -s オプションを指定すればよい。 SFC 版ドラクエ 5 の場合は LoROM, SlowROM であるため、代わりに -l -i を利用する。

あるアドレスからの逆アセンブリーコードを得たい場合は、 オプション -r で SNES アドレス値を指定することに加え、 プログラムとしてのその地点における MX レジスターフラグの状態を加味してやらねばらない。 M レジスタービットが立っている場合、オプション -a を、 X レジスタービットが立っている場合、オプション -x を与える必要がある。