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がサポートしていない命令が実行されたと覚えておくと良いかも。
(もちろん、プログラムが暴走して、想定外のメモリ領域を実行した可能性もありますが)

おすすめ

2件のフィードバック

  1. 可愛毬也 より:

    古いコンピュータを使っている人間にとってはまさに地雷ですな。
    動作条件にPENTIUM PRO以上と書いてくれればよかったんですがな。

  2. 可愛毬也 より:

    掲示板に書き込みを行った直後にDungeon Strikes Backが
    バージョンアップされました。
    ESB(添付のダンジョンエディタ)が動作するようになりました。
    逆アセンブルして見てみるとcmov系命令がきれいさっぱり
    なくなっていました。
    DSB本体のほうは相変わらずでしたが…

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です