原创 Keil C51中一个C函数被8种方法调用及效率反汇编

2009-8-12 18:47 2376 11 11 分类: MCU/ 嵌入式
来源 CEPARK网站http://www.cepark.com/Index.html  作者: hnrain面的主函数里用8种不同的方法来调用C函数,分别提供了C语句和电子园51单片机学习网 ae[J/t r[0?#|J
Keil正确运行后的跟踪反汇编代码。电子园51单片机学习网9k4rT8s D}8x9}5cU

y wU w3d0方法有人们常用的函数调用和函数指针。还有被圈圈同学称之为“变态的方法”,再就是利用COM接口技术的调用。

9tD9q:kT1e0电子园51单片机学习网4p2Y"Jq.e+](fry {

从8种方法可以看出,COM接口技术的调用方法非常灵活。电子园51单片机学习网'`O+w5FL

电子园51单片机学习网 rE%|+gF

当“变态”(俺称之为“红杏”)和COM结合对提高软件的抗击反汇编的能力
E'HZ0GW*SD/JM0可大为提高。(若再加入“汇编数组”技术,就更可想而知了)电子园51单片机学习网 jcYc Q(I8A Jv


,A:{m?7m(r qJ-H0真8种方法都会出现在即将出世的HotTask51中,估计俺会在里面大肆变态地电子园51单片机学习网Jg1n!j{K#Dj"B

电子园51单片机学习网Pf3iV%W

利用“汇编数组”及COM接口技术~~~

U(f$V"zh!P0

SL;pSz:n4m/L3w0void main()电子园51单片机学习网*B1~ y0?+L"R$N.g
{电子园51单片机学习网1E;u,p$dy!Z
/*------------------------------------------------------电子园51单片机学习网*Tc:XyO9q/J@C
    方法1.函数指针数组调用函数(C语言)          (20个字节)
i8] ov|.g$D)t K_0-------------------------------------------------------*/
\&Q |)J AA.QU3w0    pHotTaskTable[0]();//TaskInit电子园51单片机学习网T5J3Y c'w,DI&bT
    pHotTaskTable[1]();//Task1电子园51单片机学习网8?&aF JH
    pHotTaskTable[2]();//Task2电子园51单片机学习网9m6YH)`rGXq
    pHotTaskTable[3]();//Task3电子园51单片机学习网 iE.rN I%j
/*------------------------------------------------------
y,w6nZ4N0    方法2.直接地址调用函数(见菜农的HotIns.h/c)(3个字节)电子园51单片机学习网Ga%n-x.x \ O"T
-------------------------------------------------------*/
Nv$Xo%];F$qJ&[t0    _icall_((void *)TaskInit);//TaskInit
&t n g"p i7]4Q"y1s0    _icall_((void *)Task1);//Task1
2JN"Fw"K`f0    _icall_((void *)Task2);//Task2电子园51单片机学习网'gf N[3J
    _icall_((void *)Task3);//Task3
s.Fe|uM]0a#K0/*------------------------------------------------------电子园51单片机学习网4x*n[R4cG1P^
    方法3.间接地址调用函数(见菜农的HotIns.h/c) (11个字节)
S D!O3~C1@0-------------------------------------------------------*/
M Z!xZ j0em7pv0    _intjmp_(TaskInit);//TaskInit电子园51单片机学习网7TL2~`q/r/Tz
    _intjmp_(Task1);//Task1电子园51单片机学习网l'K/P vR0VfU
    _intjmp_(Task2);//Task2
Ip v0fg!f(k0    _intjmp_(Task3);//Task3
B6g5Z th#]}f$kRg0/*------------------------------------------------------电子园51单片机学习网#h8ngfp*CP:C
    方法4.函数名调用函数(C语言)              (3个字节)电子园51单片机学习网/m c8A ~HFam2S0p
-------------------------------------------------------*/电子园51单片机学习网b(sC-o$d^3um
    TaskInit();//TaskInit电子园51单片机学习网*u;Z^]3f,p RtL
    Task1();//Task1
WbO&Q!FM0    Task2();//Task2
&V/v&`lr0    Task3();//Task3
aXWv `ce0/*------------------------------------------------------电子园51单片机学习网M{|"z-hd
    方法5.函数指针数组调用函数(C语言HotIns.h/c和COM接口)(15个字节)
Z3iEK6c-R^E1R0-------------------------------------------------------*/电子园51单片机学习网,?`W:rw? d9P
    _icall_((void *)iHotTaskTable.pVtbl[0]);//TaskInit
W+dc7J2Y+~Yu\3q0    _icall_((void *)iHotTaskTable.pVtbl[1]);//Task1电子园51单片机学习网z6pzJ F*k? H*@/R
    _icall_((void *)iHotTaskTable.pVtbl[2]);//Task2电子园51单片机学习网#`A\&gJ_X1r1J
    _icall_((void *)iHotTaskTable.pVtbl[3]);//Task3电子园51单片机学习网4e(|km,G
/*------------------------------------------------------电子园51单片机学习网]7_ bY*r$\,f
    方法6.函数指针数组调用函数(C语言HotIns.h/c和COM接口)(22个字节)
Zf*_4HI}0-------------------------------------------------------*/
(z8lu SK @7Z0    _intjmp_((unsigned int)iHotTaskTable.pVtbl[0]);//TaskInit
cVAh![3Pc0    _intjmp_((unsigned int)iHotTaskTable.pVtbl[1]);//Task1电子园51单片机学习网J!M,]X-r.@C ~)U
    _intjmp_((unsigned int)iHotTaskTable.pVtbl[2]);//Task2
[3`;V!Y(}6y0    _intjmp_((unsigned int)iHotTaskTable.pVtbl[3]);//Task3电子园51单片机学习网&EF,W$E2s
/*------------------------------------------------------
6|e;y JWW0    方法7.函数指针数组调用函数(COM接口函指针数组)(15个字节)
l?@5b1K?+BK0-------------------------------------------------------*/
,y?Y-F.s^G0    iHotTaskTable.pVtbl[0]();//TaskInit电子园51单片机学习网Oi/K;g7k/AK
    iHotTaskTable.pVtbl[1]();//Task1电子园51单片机学习网 sIlD8`
    iHotTaskTable.pVtbl[2]();//Task2
}W SGB7po Y_0    iHotTaskTable.pVtbl[3]();//Task3
%p9s;f }|#s V5o Y/S%E0/*------------------------------------------------------电子园51单片机学习网3IB|"{5PMMA A
    方法8.函数指针数组调用函数(COM接口函指针名)(15个字节)
2f,E)Ko a"|}7X}DI0-------------------------------------------------------*/电子园51单片机学习网:kd8h8T1d x;lJ
    iHotTaskTable.lpVtbl.TaskInit();//TaskInit
2dz[&{.AS2z!q0    iHotTaskTable.lpVtbl.Task1();//Task1电子园51单片机学习网b#HT,s3TqJ8~
    iHotTaskTable.lpVtbl.Task2();//Task2
&DD_$wO |0    iHotTaskTable.lpVtbl.Task3();//Task3
nqK3m.{]/X%M0    HotTaskStart(TaskInit);//装载根任务电子园51单片机学习网0l$pECA1B`
}

p@ ve4oY0电子园51单片机学习网aL&s*}_3t-l

下面给出软件仿真跟踪的Keil反汇编代码粘贴:电子园51单片机学习网v{1p2n ln

电子园51单片机学习网@s/n M;e;dbe+S b:}

    12: /*------------------------------------------------------电子园51单片机学习网7Q-b6D#OcTj8t
    13:         方法1.函数指针数组调用函数(C语言)(20个字节)
9mb,Z+X\7l2^A+]gM0    14: -------------------------------------------------------*/
Lb7DG.^b.nP/N.Q0    15:         pHotTaskTable[0]();//TaskInit电子园51单片机学习网ofFm0u:d q
C:0x002E    9004E6   MOV      DPTR,#pHotTaskTable(0x04E6)电子园51单片机学习网R*x:IXW.bGy4S.j
C:0x0031    7401     MOV      A,#0x01电子园51单片机学习网7[1o7rFOdIy)a
C:0x0033    93       MOVC     A,@A+DPTR
"z*~OQ7E"kMr0C:0x0034    FA       MOV      R2,A电子园51单片机学习网-E{!^Y U-v'W
C:0x0035    7402     MOV      A,#0x02电子园51单片机学习网n4g XXC.jbE Jf
C:0x0037    93       MOVC     A,@A+DPTR
-G4x,g!Rrf5M'BIb$V0C:0x0038    F9       MOV      R1,A
"c_m*?'nx0C:0x0039    1204FA   LCALL    C?ICALL(C:04FA)电子园51单片机学习网'f!?-m*Z4u
--------------------------------------------------------------------电子园51单片机学习网`@"{\J O_(E
                 C?ICALL:
)`1^B }eJ0C:0x04FA    8A83     MOV      DPH(0x83),R2电子园51单片机学习网}'VvX!{
C:0x04FC    8982     MOV      DPTR(0x82),R1
f!T` L)OJ\xk0                 C?ICALL2:电子园51单片机学习网'U+^ @ x8zxO"v[+`
C:0x04FE    E4       CLR      A电子园51单片机学习网(U4i?*FZ*@*}
C:0x04FF    73       JMP      @A+DPTR
N T/O$rGw/H ^0    19: /*------------------------------------------------------电子园51单片机学习网~ Qn\2`o
    20:         方法2.直接地址调用函数(见菜农的HotIns.h/c)(3个字节)
U7}-O4I#~7}K ^-S&K0    21: -------------------------------------------------------*/
]L1Tq-R|m4y0    22:         _icall_((void *)TaskInit);//TaskInit电子园51单片机学习网p\O|aN7_ ?+K
C:0x0067    1202DB   LCALL    TaskInit(C:02DB)电子园51单片机学习网 s&?4J8M6N*USs D:f c'[

电子园51单片机学习网W&XNf9e4l U-l-I

    26: /*------------------------------------------------------电子园51单片机学习网7\m+^n@&r$X9Y9SA#{
    27:         方法3.间接地址调用函数(见菜农的HotIns.h/c)(11个字节)
;WY5P+BDMU(L` I0    28: -------------------------------------------------------*/
0Ce9J.KuTIB |T0    29:         _intjmp_(TaskInit);//TaskInit
1h,g} `5LPj0C:0x0073    9002DB   MOV      DPTR,#TaskInit(0x02DB)电子园51单片机学习网!lcx;K*e{
C:0x0076    1203F3   LCALL    _reset_code__(C:03F3)
%Q,w rR3x!GjEu#d(lj.m0--------------------------------------------------------------------电子园51单片机学习网 | o8w1y k L:^)s
                 _reset_code__:
3H"uu+gu/v0C:0x03F3    C082     PUSH     DPTR(0x82)电子园51单片机学习网(B!~d-LeM ^
C:0x03F5    C083     PUSH     DPH(0x83)电子园51单片机学习网F&E;@:na,A@ `
C:0x03F7    32       RETI 电子园51单片机学习网3GC#R?} j5TI!y'C
    33: /*------------------------------------------------------电子园51单片机学习网)UQ;yg3Ha
    34:         方法4.函数名调用函数(C语言) (3个字节)
wTUL!Vq0    35: -------------------------------------------------------*/
#O.g w(xxP\X0    36:         TaskInit();//TaskInit
WE!^(Q%~!Rf0C:0x008B    1202DB   LCALL    TaskInit(C:02DB)电子园51单片机学习网Q%K0d:h"E;?j~
    40: /*------------------------------------------------------
&\*cxkl%b:~eg0    41:         方法5.函数指针数组调用函数(C语言HotIns.h/c和COM接口)(15个字节)电子园51单片机学习网)`Xa`*b9A~#Q1u){
    42: -------------------------------------------------------*/
L y c$H1y ~I2G+V0    43:         _icall_((void *)iHotTaskTable.pVtbl[0]);//TaskInit电子园51单片机学习网Mq.Dj7yp r7M
C:0x0097    AB3F     MOV      R3,iHotTaskTable(0x3F)电子园51单片机学习网O2]|E)E5SP!q
C:0x0099    AA40     MOV      R2,0x40
)\ mtH:p _-_0C:0x009B    A941     MOV      R1,0x41电子园51单片机学习网 r?&LbaF"NT
C:0x009D    1204FA   LCALL    C?ICALL(C:04FA)          电子园51单片机学习网_{(Y7a#b5Q0\ LH o,l,L
--------------------------------------------------------------------电子园51单片机学习网zu7}3R/`8X0` X
                 C?ICALL:
/ku,R4G6ll%? g0C:0x04FA    8A83     MOV      DPH(0x83),R2
v3@B.F}w$uD0C:0x04FC    8982     MOV      DPTR(0x82),R1电子园51单片机学习网Z*f(N9X"_+}
                 C?ICALL2:电子园51单片机学习网k8}:a(P7R`4u"?|!l
C:0x04FE    E4       CLR      A
9r.YKr"Fa0C:0x04FF    73       JMP      @A+DPTR电子园51单片机学习网[DqEpLuk
    47: /*------------------------------------------------------
uU-R2Be$E M0    48:         方法6.函数指针数组调用函数(C语言HotIns.h/c和COM接口)(22个字节)
-b&wP ^$bag,}Z x,@0    49: -------------------------------------------------------*/电子园51单片机学习网nk8lnwi
    50:         _intjmp_((unsigned int)iHotTaskTable.pVtbl[0]);//TaskInit电子园51单片机学习网5CJ6d&N!L!B,e{{
C:0x00BB    AB3F     MOV      R3,iHotTaskTable(0x3F)
?*ER;OqSz$Gl9`-n0C:0x00BD    AA40     MOV      R2,0x40
_ly'z&kw!{n7S0C:0x00BF    A941     MOV      R1,0x41电子园51单片机学习网h y&?v6]6^\U{j
C:0x00C1    AE02     MOV      R6,0x02电子园51单片机学习网F)xh'd/xK8]
C:0x00C3    AF01     MOV      R7,0x01电子园51单片机学习网&ZR3s4r6]pe5g"}fG
C:0x00C5    8E83     MOV      DPH(0x83),R6电子园51单片机学习网%{D:N8p5I(mv/PR
C:0x00C7    8F82     MOV      DPTR(0x82),R7
_@n q_G0C:0x00C9    1203F3   LCALL    _reset_code__(C:03F3)
W QG^.]UF[0--------------------------------------------------------------------
PF*s/qVZ$v0                 _reset_code__:电子园51单片机学习网[!C['m!i|!Nb
C:0x03F3    C082     PUSH     DPTR(0x82)
b't(DSL(k.[S;`0C:0x03F5    C083     PUSH     DPH(0x83)电子园51单片机学习网9Fq\ K-N&aJ4PN
C:0x03F7    32       RETI    电子园51单片机学习网n2j/RO D9bU7QVu
    54: /*------------------------------------------------------电子园51单片机学习网:ds w6|4HL
    55:         方法7.函数指针数组调用函数(COM接口函指针数组)(15个字节)
}fE2F9Ky!y1[0    56: -------------------------------------------------------*/
e+?5SmT0T{0    57:         iHotTaskTable.pVtbl[0]();//TaskInit
)A\ E%t-BQN!ND0C:0x00FF    AB3F     MOV      R3,iHotTaskTable(0x3F)电子园51单片机学习网LE F|a
C:0x0101    AA40     MOV      R2,0x40电子园51单片机学习网 u kNK8c2xg'fh/lGA-q
C:0x0103    A941     MOV      R1,0x41
*hUDS1m0C:0x0105    1204FA   LCALL    C?ICALL(C:04FA)电子园51单片机学习网@Q'P)? U$Z
--------------------------------------------------------------------电子园51单片机学习网;X9g9MJU*| z}
                 C?ICALL:
8b4d Ok-E7T0C:0x04FA    8A83     MOV      DPH(0x83),R2电子园51单片机学习网,~0`-hX*}Xf7{7R!n
C:0x04FC    8982     MOV      DPTR(0x82),R1电子园51单片机学习网-W z"v"] Zx |3S d
                 C?ICALL2:
T(N3EzwaK({p0C:0x04FE    E4       CLR      A电子园51单片机学习网sRG9^Ru F
C:0x04FF    73       JMP      @A+DPTR电子园51单片机学习网k0v'MV,sJ
    61: /*------------------------------------------------------电子园51单片机学习网C2B)R)K.V8B i _|
    62:         方法8.函数指针数组调用函数(COM接口函指针名)(15个字节)
jx#t*X` f6X+V%h0    63: -------------------------------------------------------*/电子园51单片机学习网y:lB0vQJ&r-R4j
    64:         iHotTaskTable.lpVtbl.TaskInit();//TaskInit电子园51单片机学习网'eeV#q1AeZ M
C:0x0123    AB3F     MOV      R3,iHotTaskTable(0x3F)
.pkrX.v)L1P0C:0x0125    AA40     MOV      R2,0x40
\ oB9sTHq9VK0C:0x0127    A941     MOV      R1,0x41电子园51单片机学习网W d-K$M-V#o3STK
C:0x0129    1204FA   LCALL    C?ICALL(C:04FA)
:V4P7p{6|l.bH0--------------------------------------------------------------------
nb,Odb]j%x"W0                 C?ICALL:
]:Y:O"LO1dx0C:0x04FA    8A83     MOV      DPH(0x83),R2
:k$w%Y&ZX:F)D+]"?0C:0x04FC    8982     MOV      DPTR(0x82),R1
fJ/?.Z$M u(a.Q0                 C?ICALL2:电子园51单片机学习网0R9gO W'nL4@Y G
C:0x04FE    E4       CLR      A电子园51单片机学习网;W{)wE"H2^p2zG-}
C:0x04FF    73       JMP      @A+DPTR电子园51单片机学习网w)wrtuX-]M


?3XC;d$I3X{9lrO0电子园51单片机学习网wP/V1`9i n3gj.l
菜农HotPower@126.com  2009.2.17 4:10 于菜地成功移植COM接口到51后电子园51单片机学习网l `$L i3f*l(eo K:o__
电子园51单片机学习网T}{'K3cNC

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
11
关闭 站长推荐上一条 /3 下一条