【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

整数型

整数型のbyteとshortをサポートしました。

CompilerLib

CompilerLibで8bitや16bitの命令をサポートしていなかったので対応しました。機械的な書き換えだったので、Perlで自動生成しました。utilsディレクトリに入っています。

どのようにbit数を指定するかが問題になりました。WORD [EAX]の表記から、Addr32のコンストラクタで指定する方法を考えました。new Addr32(Bits.Word, Reg32.EAX) のようなイメージです。しかし MOV [EAX], EBX のようにbit数指定が無意味な場合もあるので、Addr32に持たせても意味がないケースがあります。

そのためgasと同じようにニーモニックに接尾辞を付けることにしました。MovW, MovBなど。MOV [EAX], BX のように接尾辞を付けなくても区別が付くケースもありますが、統一性がなくなるのですべて接尾辞を付けることにしました。

メモリとレジスタ

byteの計算は8bitレジスタで行う方が自然ですが、型によってコードが変わってしまうためコンパイラ側の対応が大変です。そのためメモリだけを型に応じたサイズにしておいて、レジスタに代入するときはMOVSXを使って32bitに変換するようにしました。そのため計算処理には一切手を入れずに、メモリI/Oだけをbyteやshortに対応するだけで済みました。

ABIについても、関数の引数にbyteやshortを渡しても32bitでPUSHされるため、この方針ですんなり対応することができました。

今後

これで整数だけの処理はほとんど記述できるようになりました。浮動小数点数への対応はすぐに必要ではないため後回しにして、オブジェクト指向や関数周りの機能を強化していこうと思います。