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!P0SL;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`
}
下面给出软件仿真跟踪的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'[
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
文章评论(0条评论)
登录后参与讨论