ZHCU876Z July 2001 – October 2023 SM320F28335-EP
本节中的示例说明名称还原过程。
该示例显示了示例 C++ 程序。在该示例中,所有函数的链接名称都已改编;也就是说,函数的签名信息已编码到函数的名称中。
int compute(int val, int *err);
int foo(int val, int *err)
{
static int last_err = 0;
int result = 0
if (last_err == 0)
result = compute(val, &last_err);
*err = last_err;
return result;
}
编译器输出的汇编代码结果如下。
;***************************************************************
;* FNAME: _foo_FiPi FR SIZE: 4 *
;* *
;* FUNCTION ENVIRONMENT *
;* *
;* FUNCTION PROPERTIES *
;* 0 Parameter, 3 Auto, 0 SOE *
;***************************************************************
_foo_FiPi:
ADDB SP,#4
MOVZ DP,#_last_err$1
MOV *-SP[1],AL
MOV AL,@_last_err$1
MOV *-SP[2],AR4
MOV *-SP[3],#0
BF L1,NEQ
; branch occurs
MOVL XAR4,#_last_err$1
MOV AL,*-SP[1]
LCR #_compute__FiPi
; call occurs [#_compute__FiPi]
MOV *-SP[3],AL
L1:
MOVZ AR6,*-SP[2]
MOV *+XAR6[0],*(0:_last_err$1)
MOV AL,*-SP[3]
SUBB SP,#4
LRETR
; return occurs
执行 C++ 名称还原器将会还原其认为已改编的所有名称。输入:
dem2000 foo.asm
运行 C++ 名称还原器后的结果如下所示。foo( ) 和 compute( ) 中的链接名称已还原。
;***************************************************************
;* FNAME: foo(int, int *) FR SIZE: 4 *
;* *
;* FUNCTION ENVIRONMENT *
;* *
;* FUNCTION PROPERTIES *
;* 0 Parameter, 3 Auto, 0 SOE *
;***************************************************************
foo(int, int *):
ADDB SP,#4
MOVZ DP,#_last_err$1
MOV *-SP[1],AL
MOV AL,@_last_err$1
MOV *-SP[2],AR4
MOV *-SP[3],#0
BF L1,NEQ
; branch occurs
MOVL XAR4,#_last_err$1
MOV AL,*-SP[1]
LCR #compute(int, int *)
; call occurs [#compute(int, int *)]
MOV *-SP[3],AL
L1:
MOVZ AR6,*-SP[2]
MOV *+XAR6[0],*(0:_last_err$1)
MOV AL,*-SP[3]
SUBB SP,#4
LRETR
; return occurs