私はこの古典的な機能を書いた:(32ビットモードで)間違ったVisual Studioアセンブリ出力?
void ex(size_t a, size_t b)
{
size_t c;
c = a;
a = b;
b = c;
}
次のように私は、メインの内側にそれを呼び出す:
size_t a = 4;
size_t b = 5;
ex(a,b);
私が入ったときに生成されたアセンブリコードから期待していた何を
スタックにBの値を1プッシュ:(行った)
mov eax,dword ptr [b]
push eax
mov ecx,dword ptr [a]
push ecx
関数は次のようなものです
2-使用スタック内の値とB:他の変数の
push ebp
mov ebp, esp
sub esp, 4
c = a;
mov eax, dword ptr [ebp+8]
mov dword ptr [ebp-4], eax
など。
しかし、これはデバッグ時に、私が見つけるものです:
push ebp
mov ebp,esp
sub esp,0CCh // normal since it's in debug with ZI option
push ebx
push esi
push edi
lea edi,[ebp-0CCh]
mov ecx,33h
mov eax,0CCCCCCCCh
rep stos dword ptr es:[edi]
size_t c;
c = a;
mov eax,dword ptr [a]
mov dword ptr [c],eax
なぜそれが変数を使用して、直接の代わりに、スタックに格納された値を呼んでいますか?私は理解していません...
整数を呼び出すことはできません。関数だけが呼び出されます。他の動詞を使う必要があります。 –
あなたの関数は無意味なので、あなたは無意味なことが起こることを本当に期待することができます。いくつかのローカル変数を操作してから、戻り値なしで副作用なしに戻ります。私は非デバッグビルドでは、あなたの関数は何もコンパイルされないだろうと確信しています。 –
funcitonは何もしないので、コードが生成されているのには驚いています。 – ThingyWotsit