x64 環境では基本 64bit アドレッシングですが、命令セットの仕様上は 32bit アドレッシングも可能です。しかし、普通に触るような環境では 32bit アドレッシングは使いません。

Ut Video Codec Suite 12.0.1 で修正した「デコーダがクラッシュする」バグは、x86 用コードを x64 用に移植する際に修正漏れがあったために、64bit アドレッシングしなければいけないところで 32bit アドレッシングしてしまったせいで起きたものです。アドレスが 32bit の範囲に入っていれば問題は起きませんが、それを超えると変なところにアクセスしてクラッシュします。

どうせ 32bit アドレッシングなんて使わないのだからアセンブル時に検出してほしい所なのですが、nasm にはそういうオプションは無いようです。仕方がないので以下のように簡易的に探しました。

$ egrep '\[.*(e([abcd]x|[sd]i|[bs]p)|r([89]|1[012345])d).*\]' *_x64.asm

マクロを駆使してたりすると漏れが発生しますが…

あと、intrinsic を使って組むとこの問題を自然に回避することができますが、intrinsic は好きじゃないんですよね。

Trackback

only 1 comment untill now

  1. x64 Windows での 32bit アドレッシングを捕捉する方法

    茂木さんに教えてもらったことなんですが。 x64 Windows 向けのプログラムで、32bit アドレッシングをしていたり、うっかりポインタを 32bit にキャストした後に使ってしまったりすると、32bi…

Add your comment now