0
int _tmain(int argc, _TCHAR* argv[])
{
004113D0  push        ebp  
004113D1  mov         ebp,esp 
004113D3  sub         esp,0E4h 
004113D9  push        ebx  
004113DA  push        esi  
004113DB  push        edi  
004113DC  lea         edi,[ebp-0E4h] 
004113E2  mov         ecx,39h 
004113E7  mov         eax,0CCCCCCCCh 
004113EC  rep stos    dword ptr es:[edi] 
    int a=2;
004113EE  mov         dword ptr [a],2 
    int b=3;
004113F5  mov         dword ptr [b],3 
    int c=add(&a,&b);
004113FC  lea         eax,[b] 
004113FF  push        eax  
00411400  lea         ecx,[a] 
00411403  push        ecx  
00411404  call        add (4111CCh) 
00411409  add         esp,8 
0041140C  mov         dword ptr [c],eax 
    printf("%d",c);
0041140F  mov         esi,esp 
00411411  mov         eax,dword ptr [c] 
00411414  push        eax  
00411415  push        offset string "%d" (41563Ch) 
0041141A  call        dword ptr [__imp__printf (4182B8h)] 
00411420  add         esp,8 
00411423  cmp         esi,esp 
00411425  call        @ILT+310(__RTC_CheckEsp) (41113Bh) 
    return 0;
0041142A  xor         eax,eax 
}
0041142C  push        edx  
0041142D  mov         ecx,ebp 
0041142F  push        eax  

00411430 lea edx,[ (411454h)] //セキュリティ手順の前に、LEA ディレクティブはここで何をしますか?

00411436  call        @ILT+140(@_RTC_CheckStackVars@8) (411091h) 
4

2 に答える 2

4

// セキュリティ手順の前に、LEA ディレクティブはここで何をしますか?

これは「セキュリティ手順」ではありません。/RTC オプションをオンにして、デバッグ ビルドで MSVC コンパイラによって生成されたコードを見ています。RTC は実行時エラー チェックを意味します。LEA 命令は、スタック フレーム内のローカル変数を記述する、コンパイラによって生成されたテーブルのアドレスをロードします。それらは整理されているため、それらの間に未使用のバイト、つまり 0xcc で埋められたバイトがあります。これは、アドレス 004113EC で発生しています。

_RTC_CheckStackVars@8 デバッグ関数は、このテーブルを使用して、それらのバイトがまだ同じ値を持っているかどうかを確認します。そうでない場合は、コードにバグがあり、スタック フレームを踏みつぶしたという決定的な証拠があります。通常、スタック上の配列の最後をオーバーランします。この種のバグは、このデバッグ支援なしでは診断が非常に難しい場合があります。 非常に便利です。

于 2013-01-23T02:39:55.360 に答える
1
lea edx, [(411454h)]

と同じです

mov edx, offset [(411454h)]
于 2013-01-23T02:21:36.597 に答える