C++代码VS反汇编中'dword ptr[this]'的含义是什么?
语句含义解释
前置背景
你观察到的行为是Windows平台MSVC编译器默认__thiscall成员函数调用约定的Debug模式实现规则:
- 调用非静态成员函数前,调用方必须把类实例的内存地址存入ECX寄存器,作为隐含的
this指针参数传递给成员函数
第一行疑问语句:mov dword ptr [this],ecx
这行是Debug模式下的编译器额外插入的调试辅助逻辑,作用是把ECX里存的实例地址,备份到栈上专门分配给this指针的内存空间里:
- 你可以看到前序代码里有
push ecx-> 初始化栈局部空间为0xCC(用到ECX寄存器) ->pop ecx的逻辑,就是因为初始化栈的操作会覆盖ECX的值,所以要先备份再恢复 - 把
this指针存到栈上的目的是方便调试时查看、修改this指向的内容,也避免后续代码误改ECX后丢失实例地址
第二行疑问语句:mov eax,dword ptr [this]
这行是访问类成员变量的前置操作,后续的逻辑完全对应你C++代码里的return _x + _y:
- 先把栈上存的
this指针(即实例首地址)读到EAX寄存器 mov eax,dword ptr [eax]:取实例首地址偏移0位置的成员_x的值存入EAXmov ecx,dword ptr [this]:再次把this指针读到ECXadd eax,dword ptr [ecx+4]:取实例首地址偏移4位置的成员_y的值,和EAX里的_x相加,结果作为Do()函数的返回值
补充说明
如果是Release优化模式编译,编译器会直接复用ECX里的实例地址访问成员,不会额外把ECX存到栈再读出来,会省掉这部分冗余的内存读写操作,执行效率更高。
内容的提问来源于stack exchange,提问作者lfree
相关产品推荐
相关产品推荐

