CMOV問題とi686
掲示板の方にあるソフトが 0xC000001D (Illegal Instruction) で例外がでて落ちるというので逆アセンブルしてみたところ、 cmovle という命令で落っこちていることが分かりました。
このcmovle というのは、レジスタの値による条件分岐でメモリ転送を行う命令です。
調べてみると興味深いことが書かれていました。
このcmov 命令は i686(Pentium Pro)以降で実行できる命令なのですが、 VIA C3はCPU情報として、i686を返してくれるのですが、この命令をサポートしていないのです。
VIA C3 Ezla を Debian でサポートする
cmov 命令についてはこちら。
Data Transfer Instructions (x86 Assembly Language Reference Manual)
cmov に分岐条件の拡張語尾がくっついて
cmovnb, cmova, cmovge, cmovpo などの命令になるわけである。
0xC000001D が発生したら、CPUがサポートしていない命令が実行されたと覚えておくと良いかも。
(もちろん、プログラムが暴走して、想定外のメモリ領域を実行した可能性もありますが)
古いコンピュータを使っている人間にとってはまさに地雷ですな。
動作条件にPENTIUM PRO以上と書いてくれればよかったんですがな。
掲示板に書き込みを行った直後にDungeon Strikes Backが
バージョンアップされました。
ESB(添付のダンジョンエディタ)が動作するようになりました。
逆アセンブルして見てみるとcmov系命令がきれいさっぱり
なくなっていました。
DSB本体のほうは相変わらずでしたが…