② sub esp, 44h
在存儲了ebp,并且重新對ebp賦值了后,代碼將esp減去44h,這個區域是預留給函數的局部變量的。在該函數中定義的局部變量,將依次序在這塊區域中得到分配。
有人說了,萬一這個44h的區域不夠怎么辦,實際上這個44h是可以變化的,編譯器會根據實際情況調整這個數值。我測試了一下,如果定義了1個變量,就會分配44h的空間,定義了2個變量,就會分配48h的空間……依次類推。
③ push ebx
push esi
push edi
lea edi,[ebp-44h]
分配了44h空間后,ebx, esi, edi的值將依次入棧。為什么要先分配44h的空間,再push這三個寄存器,而不是一口氣把ebp, ebx, esi, edi這四個東東全部都壓進去,再分配局部變量的空間呢。
我想是因為這個空間是分配給局部變量的,而所有局部變量的地址都是通過ebp加上偏移量算出來的,因此讓這個空間和ebp緊挨能夠提高運算的效率。
ebx寄存器是基地址寄存器,是四個數據寄存器中唯一可作為存儲器指針使用的寄存器。esi寄存器是源變址寄存器,edi則是目的變址寄存器。這兩個寄存器的典型用法就是進行字符串操作時,esi作為源指針,edi作為目的指針。
lea edi, [ebp-44h] 這一句使得edi的值由0x00000000變成了(0x12ff80 – 44h = )0x12ff3c,這個地址是44h的最后一個地址,至于為什么要賦成這個值,我們馬上就會知道了。