2013-01-23 41 views
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指令在這裏做什麼?當只有位移被使用時,LEA指令會做什麼?

00411436 call  @ILT+140(@[email protected]) (411091h) 
+0

[LEA指令的目的是什麼?](http://stackoverflow.com/questions/1658294/whats-the-purpose-of-the-lea-instruction) –

+0

我知道lea的含義指令,但LEA指令在那裏做什麼 –

回答

4

//什麼LEA指令在這裏做,安全程序之前?

這不是一個「安全程序」。您正在查看Debug版本中MSVC編譯器生成的代碼,並打開了/ RTC選項。 RTC表示運行時錯誤檢查。 LEA指令加載由編譯器生成的描述堆棧幀中局部變量的表的地址。它們的組織方式使得它們之間具有未使用的字節,填充了0xcc的字節。您在地址004113EC處看到的情況。

_RTC_CheckStackVars @ 8調試函數使用此表來檢查這些字節是否仍具有相同的值。如果沒有,那麼就有確鑿的證據表明代碼存在錯誤並且堆棧堆棧。通常通過溢出堆棧上數組的結束。如果沒有這種調試幫助,這些類型的錯誤可能很難診斷。 非常有用

+0

非常感謝! –

1
lea edx, [(411454h)] 

相同

mov edx, offset [(411454h)] 
+0

我知道他們做了同樣的事情,但我想不出(或在網上找到一個理由)爲什麼編譯器會在'mov'上產生'lea'。那裏有任何想法? – DocMax

+0

當然:'lea'完成這項工作,那麼爲什麼編譯器在這種情況下僅僅使用'mov',而在更復雜的地址計算需要'lea'時呢? –

+0

我不確定我關注。從周圍的程序集看起來像一個帶有指向全局變量的方法的快速調用方法,至少在VS 2010中,將指針傳遞給全局變量時會生成一個'mov'。我想我可以更好地理解'lea',如果我能找到一個它爲輸入執行地址計算的情況。 – DocMax

相關問題