SSブログ

Turbo C++ 2006 Explorer (3) - インラインアセンブラ [パソコン/ソフト]

 Turbo C++™ Explorer のインラインアセンブラの変数アクセスには癖があるようだ。

 hoge クラス内の bool z; を、

void
hoge::func(void)
{
    __asm {
        mov eax,this
        cmp [eax].z,0 //*A*
        mov [eax].z,0 //*B*
   }

}

というふうに使用すると、z (byte サイズ) は dword 変数扱いになるらしく、色々と拙いこと( mov では、z 以外の領域に 0 を入れたり,cmp では、z 以外の領域の状態で不定)になる。
 -S オプションでは、*A* と *B* が、

    cmp [eax]+0,0   ;*A*
    mov [eax]+0,0   ;*B*

というふうになり、tasm32 に、"Argument needs type override"と警告される。

変数のサイズを、

void
hoge::func(void)
{
    __asm {
        mov eax,this
        cmp byte ptr [eax].z,0 //*A*
        mov byte ptr [eax].z,0 //*B*
   }

}

というふうに付けろ、ということなのだろうか。

 サイズ指定をうっかり忘れると不安定な事になるので、注意が要る“仕様”だと思う。

 RAD STUDIO の C++Builder でも同じ。


nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0