JTAG ICEにMIPS用逆アセンブラを搭載
今夜の作業は、MIPS用の逆アセンブラの開発です。
MIPSの命令は、左6ビットが命令コードになっていて、64種類の命令の大まかなカテゴリがあるようです。ただし、これでは足りないので、いくつかの命令は、他のフィールドを読むことでその種類が決定されるという体系になっているようです。
つまり、階層的にできているので、何枚かの表をつくれば逆アセンブラを作ることができます。
たとえば、10100011001010010001110001011100 という命令があるとすると、左端の101000というのがopcodeを表していて、これはSB(Store Byte)という命令だということがわかります。
こんどは、000000 01001010011001011000 100000という命令があるとすると、左端の6ビットが000000です。これは"SPECIAL"という一種の命令群であって、実際の命令コードは右端の100000となります。つまり、左端がSPECIALであって、右端が100000なのはADD命令ということになります。
このように、何段かのテーブルをひくことで、MIPSの命令は理解することができます。このテーブルを引くための領域が、左端と、真中か右端に固まってくれているので、ソフトウェアで機械的に処理しやすいといえます。
一方、ARMの命令体系も同じような感じではあるのですが、命令コードを判断するためのフィールドの部分の長さや位置がまちまちだったり、飛び地があったりするので、逆アセンブラを作るのはとても面倒でした。
MIPSは、ARMよりはスッキリしていると実感しました。
作業を始めてから4時間くらいで、簡易版逆アセンブラを実装することができました。
まだいくつか解釈できない命令がありますが、全命令を実装するのは、そんなに難しいことではないでしょう。
MIPS用のJTAG ICEを開発していて悩ましいことは、イレギュラーなケースに対応させることが難しいということです。例えば、ICEが動作中にターゲットボードの電源を落としたりリセットをかけたり、または、CPUの動作を停止させたままパソコン上のICEのプログラムを再起動した場合でも元の状態に戻れるか、などという問題があります。
| 固定リンク


コメント