ZHCUAQ1F july 2015 – april 2023
本节中的示例说明名称还原过程。
该示例显示了示例 C++ 程序。在该示例中,所有函数的链接名称都已改编;也就是说,函数的签名信息已编码到函数的名称中。
class banana {
public:
int calories(void);
banana();
~banana();
};
int calories_in_a_banana(void)
{
banana x;
return x.calories();
}
编译器输出的汇编代码结果如下。
_calories_in_a_banana__Fv:
;** ----------------------------------------------------------------------*
CALL .S1 ___ct__6bananaFv
STW .D2T2 B3,*SP--(16)
MVKL .S2 RL0,B3
MVKH .S2 RL0,B3
ADD .S1X 8,SP,A4
NOP 1
RL0: ; CALL OCCURS
CALL .S1 _calories__6bananaFv
MVKL .S2 RL1,B3
ADD .S1X 8,SP,A4
MVKH .S2 RL1,B3
NOP 2
RL1: ; CALL OCCURS
CALL .S1 ___dt__6bananaFv
STW .D2T1 A4,*+SP(4)
ADD .S1X 8,SP,A4
MVKL .S2 RL2,B3
MVK .S2 0x2,B4
MVKH .S2 RL2,B3
RL2: ; CALL OCCURS
LDW .D2T1 *+SP(4),A4
LDW .D2T2 *++SP(16),B3
NOP 4
RET .S2 B3
NOP 5
; BRANCH OCCURS
执行 C++ 名称还原器将会还原其认为已改编的所有名称。输入:
dem6x calories_in_a_banana.asm
运行 C++ 名称还原器后的结果如下所示。_ZN6bananaC1Ev、_ZN6banana8caloriesEv 和 _ZN6bananaD1Ev 中的链接名称已还原。
calories_in_a_banana():
;** ----------------------------------------------------------------------*
CALL .S1 banana::banana()
STW .D2T2 B3,*SP--(16)
MVKL .S2 RL0,B3
MVKH .S2 RL0,B3
ADD .S1X 8,SP,A4
NOP 1
RL0: ; CALL OCCURS
CALL .S1 banana::calories()
MVKL .S2 RL1,B3
ADD . S1X 8,SP,A4
MVKH .S2 RL1,B3
NOP 2
RL1: ; CALL OCCURS
CALL .S1 banana::~banana()
STW .D2T1 A4,*+SP(4)
ADD .S1X 8,SP,A4
MVKL .S2 RL2,B3
MVK . S2 0x2,B4
MVKH . S2 RL2,B3
RL2: ; CALL OCCURS
LDW .D2T1 *+SP(4),A4
LDW .D2T2 *++SP(16),B3
NOP 4
RET .S2 B3
NOP 5
; BRANCH OCCURS