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 でも同じ。
コメント 0