首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

ecx与this指针的有关问题

2012-04-07 
ecx与this指针的问题class A{public:A(){}int i}int main(){A areturn 0}主函数:.text:00401020 _main

ecx与this指针的问题
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指针的

[解决办法]

探讨
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
.te……

[解决办法]
这个代码确实比较费解:
.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的地址。




[解决办法]
this是指向对象的(object),
这个代码中:
.text:00401038 lea ecx, [ebp+var_4]
取的地址就是this。

热点排行