昨日のネタの続き -逆アセコードを乗せてみる

関数の引数に、++ した変数を連続で直接書いてしまうと、妙なコードをはいてしまう件。混合モードでアセンブラコードを見てみました。

前置きInc <>

// int n = 0;
mov  dword ptr [n],0 

// Func(++n, ++n);
mov  eax,dword ptr [n] 
add  eax,1 
mov  dword ptr [n],eax  // + ※A
mov  ecx,dword ptr [n]  // |
add  ecx,1 
mov  dword ptr [n],ecx 
mov  edx,dword ptr [n] 
push edx  
mov  eax,dword ptr [n] 
push eax  
call Func (411190h)

asm にゃー詳しくないのですが、dword ptr [n] を見に行くってなんか変じゃね? 'n' (==ぬるぽ) が指している先の値を見に行ってるというのが変な気が…。そもそも VC の混合モードの表示が間違ってるのかしら。

つか私にゃー "※A" のところが激しく無駄に見えて仕方ないのですが、x86じゃーこうすると高速化するんでしょうか……。^^;

…と思ったけど、最適化かかってないんだから、このコードで正解じゃん。(ぉ

前置きInc <>

// int n = 0;
// Func(++n, ++n);
push 2    
push 2    
push offset string "a = %d, b = %d\n" (4070FCh) 
call printf (401037h) 

リテラル "2" がとても美しいですね!



…VCは、ソースファイルを超えて最適化できるので私的には評価が高いのですが、細かい部分で問題がるんだよなぁ…。 http://d.hatena.ne.jp/ir9Ex/20051029/1130535752 とかさぁー