② 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的最后一个地址,至于为什么要赋成这个值,我们马上就会知道了。