【问题标题】:class constructor disassembly类构造函数反汇编
【发布时间】:2011-09-23 13:55:23
【问题描述】:

调用构造函数后有一小段反汇编,没有任何意义。在这里,

.text:011A18F0 loc_11A18F0:                            ; CODE XREF: main+5Bj
.text:011A18F0                 mov     [ebp+again_obj], 0
.text:011A18FA
.text:011A18FA loc_11A18FA:                            ; CODE XREF: main+6Ej
.text:011A18FA                 mov     eax, [ebp+again_obj]
.text:011A1900                 mov     [ebp+var_104], eax
.text:011A1906                 mov     [ebp+var_4], 0FFFFFFFFh
.text:011A190D                 mov     ecx, [ebp+var_104]
.text:011A1913                 mov     [ebp+var_14], ecx
.text:011A1916                 mov     eax, [ebp+var_14]
.text:011A1919                 mov     [ebp+var_E0], eax
.text:011A191F                 mov     ecx, [ebp+var_E0]
.text:011A1925                 mov     [ebp+var_EC], ecx
.text:011A192B                 cmp     [ebp+var_EC], 0
.text:011A1932                 jz      short loc_11A1949

我不明白为什么0FFFFFFFFh被移入var_4,为什么很多值被移入和移出变量,这里的做法。已经关闭优化,我在VS2010平台编译源码。

【问题讨论】:

  • 我可能错了,但这看起来像是在调试模式下对某些变量和寄存器进行了一些默认初始化,以帮助发现未初始化的变量。

标签: c++ class reverse-engineering disassembly


【解决方案1】:

var_4 是一个内部变量(我称之为'_state'),它跟踪构造对象的状态,以便在发生异常时展开。您看到的是 VC++ 在处理新对象时创建的一种常见模式。例如

 A* pA1 = new A();

被转换成这样的东西:

_state = -1;
...
A *temp_pA1 = operator new(sizeof(A));
_state = 0;
if ( temp_pA1 != NULL ) 
{
   pA1 = A::A(temp_pA1);
}
else
{
   pA1 = NULL;
}
_state = -1;
...
[unwind funclet for state == 0]
{
  A::~A(temp_pA1);
}

如您所见,在对象的内存块被新建但对象尚未构造后,它被设置为某个值(例如 0)。这样,如果构造函数中发生异常,异常处理程序将自动释放分配的内存。构造完成后设置为-1,大致对应“自动的东西已经完成,现在所有的内存管理都在程序员手中”。

请参阅here 了解更多详细信息(“C++ 异常模型实现”和“带有 C++ 异常的示例程序”)。

【讨论】:

    猜你喜欢
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多