class A
{
public:
A(){}
int i;
};
int main()
{
A a;
return 0;
}
主函数:
.text:00401020 _main proc near ; CODE XREF: _main_0j
.text:00401020
.text:00401020 var_44 = byte ptr -44h
.text:00401020 var_4 = byte ptr -4
.text:00401020
.text:00401020 push ebp
.text:00401021 mov ebp, esp
.text:00401023 sub esp, 44h
.text:00401026 push ebx
.text:00401027 push esi
.text:00401028 push edi
.text:00401029 lea edi, [ebp+var_44]
.text:0040102C mov ecx, 11h
.text:00401031 mov eax, 0CCCCCCCCh
.text:00401036 rep stosd
.text:00401038 lea ecx, [ebp+var_4]
.text:0040103B call j_??0A@@QAE@XZ ; A::A(void)
.text:00401040 xor eax, eax
.text:00401042 pop edi
.text:00401043 pop esi
.text:00401044 pop ebx
.text:00401045 add esp, 44h
.text:00401048 cmp ebp, esp
.text:0040104A call __chkesp
.text:0040104F mov esp, ebp
.text:00401051 pop ebp
.text:00401052 retn
.text:00401052 _main endp
构造函数代码:
.text:00401060 ; public: __thiscall A::A(void)
.text:00401060 ??0A@@QAE@XZ proc near ; CODE XREF: .text:00401005j
.text:00401060 ; A::A(void)j
.text:00401060
.text:00401060 var_44 = byte ptr -44h
.text:00401060 var_4 = dword ptr -4
.text:00401060
.text:00401060 push ebp
.text:00401061 mov ebp, esp
.text:00401063 sub esp, 44h
.text:00401066 push ebx
.text:00401067 push esi
.text:00401068 push edi
.text:00401069 push ecx
.text:0040106A lea edi, [ebp+var_44]
.text:0040106D mov ecx, 11h
.text:00401072 mov eax, 0CCCCCCCCh
.text:00401077 rep stosd
.text:00401079 pop ecx
.text:0040107A mov [ebp+var_4], ecx
.text:0040107D mov eax, [ebp+var_4]
.text:00401080 pop edi
.text:00401081 pop esi
.text:00401082 pop ebx
.text:00401083 mov esp, ebp
.text:00401085 pop ebp
.text:00401086 retn
.text:00401086 ??0A@@QAE@XZ endp
疑问:ecx并没有被初始化 他是怎样充当this指针的
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
这个代码确实比较费解:
.text:00401023 sub esp, 44h
.text:00401026 push ebx
.text:00401027 push esi
.text:00401028 push edi
.text:00401029 lea edi, [ebp+var_44]
.text:0040102C mov ecx, 11h
.text:00401031 mov eax, 0CCCCCCCCh
.text:00401036 rep stosd
是几乎所有函数都使用的初始化栈中局部变量区域,
初始化为0CCCCCCCCh的目的是说明这个区域非代码,
如果程序发生错误,执行该区域就是int3,也就是引起单步中断。
随后的:
.text:00401038 lea ecx, [ebp+var_4]
就是把ebp+var_4作为A a的地址,
实际也就是第一个数据成员int i的地址。