打印
[51反汇编]

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

[复制链接]
4264|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2012-11-1 22:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hotpower 于 2012-11-1 22:40 编辑

下面的主函数里用8种不同的方法来调用某C函数,分别提供了C语句和
Keil正确运行后的跟踪反汇编代码。

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

从8种方法可以看出,COM接口技术的调用方法非常灵活。

当“变态”(俺称之为“红杏”)和COM结合对提高软件的抗击反汇编的能力
可大为提高。(若再加入“汇编数组”技术,就更可想而知了)

真8种方法都会出现在即将出世的HotTask51中,估计俺会在里面大肆变态地

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

void main()
{
/*------------------------------------------------------
方法1.函数指针数组调用函数(C语言)          (20个字节)
-------------------------------------------------------*/
pHotTaskTable[0]();//TaskInit
pHotTaskTable[1]();//Task1
pHotTaskTable[2]();//Task2
pHotTaskTable[3]();//Task3
/*------------------------------------------------------
方法2.直接地址调用函数(见菜农的HotIns.h/c)(3个字节)
-------------------------------------------------------*/
_icall_((void *)TaskInit);//TaskInit
_icall_((void *)Task1);//Task1
_icall_((void *)Task2);//Task2
_icall_((void *)Task3);//Task3
/*------------------------------------------------------
方法3.间接地址调用函数(见菜农的HotIns.h/c) (11个字节)
-------------------------------------------------------*/
_intjmp_(TaskInit);//TaskInit
_intjmp_(Task1);//Task1
_intjmp_(Task2);//Task2
_intjmp_(Task3);//Task3
/*------------------------------------------------------
方法4.函数名调用函数(C语言)              (3个字节)
-------------------------------------------------------*/
TaskInit();//TaskInit
Task1();//Task1
Task2();//Task2
Task3();//Task3
/*------------------------------------------------------
方法5.函数指针数组调用函数(C语言HotIns.h/c和COM接口)(15个字节)
-------------------------------------------------------*/
_icall_((void *)iHotTaskTable.pVtbl[0]);//TaskInit
_icall_((void *)iHotTaskTable.pVtbl[1]);//Task1
_icall_((void *)iHotTaskTable.pVtbl[2]);//Task2
_icall_((void *)iHotTaskTable.pVtbl[3]);//Task3
/*------------------------------------------------------
方法6.函数指针数组调用函数(C语言HotIns.h/c和COM接口)(22个字节)
-------------------------------------------------------*/
_intjmp_((unsigned int)iHotTaskTable.pVtbl[0]);//TaskInit
_intjmp_((unsigned int)iHotTaskTable.pVtbl[1]);//Task1
_intjmp_((unsigned int)iHotTaskTable.pVtbl[2]);//Task2
_intjmp_((unsigned int)iHotTaskTable.pVtbl[3]);//Task3
/*------------------------------------------------------
方法7.函数指针数组调用函数(COM接口函指针数组)(15个字节)
-------------------------------------------------------*/
iHotTaskTable.pVtbl[0]();//TaskInit
iHotTaskTable.pVtbl[1]();//Task1
iHotTaskTable.pVtbl[2]();//Task2
iHotTaskTable.pVtbl[3]();//Task3
/*------------------------------------------------------
方法8.函数指针数组调用函数(COM接口函指针名)(15个字节)
-------------------------------------------------------*/
iHotTaskTable.lpVtbl.TaskInit();//TaskInit
iHotTaskTable.lpVtbl.Task1();//Task1
iHotTaskTable.lpVtbl.Task2();//Task2
iHotTaskTable.lpVtbl.Task3();//Task3
HotTaskStart(TaskInit);//装载根任务
}

下面给出软件仿真跟踪的Keil反汇编代码粘贴:

12: /*------------------------------------------------------
13:         方法1.函数指针数组调用函数(C语言)(20个字节)
14: -------------------------------------------------------*/
15:         pHotTaskTable[0]();//TaskInit
C:0x002E    9004E6   MOV      DPTR,#pHotTaskTable(0x04E6)
C:0x0031    7401     MOV      A,#0x01
C:0x0033    93       MOVC     A,@A+DPTR
C:0x0034    FA       MOV      R2,A
C:0x0035    7402     MOV      A,#0x02
C:0x0037    93       MOVC     A,@A+DPTR
C:0x0038    F9       MOV      R1,A
C:0x0039    1204FA   LCALL    C?ICALL(C:04FA)
--------------------------------------------------------------------
C?ICALL:
C:0x04FA    8A83     MOV      DPH(0x83),R2
C:0x04FC    8982     MOV      DPTR(0x82),R1
C?ICALL2:
C:0x04FE    E4       CLR      A
C:0x04FF    73       JMP      @A+DPTR
19: /*------------------------------------------------------
20:         方法2.直接地址调用函数(见菜农的HotIns.h/c)(3个字节)
21: -------------------------------------------------------*/
22:         _icall_((void *)TaskInit);//TaskInit
C:0x0067    1202DB   LCALL    TaskInit(C:02DB)

26: /*------------------------------------------------------
27:         方法3.间接地址调用函数(见菜农的HotIns.h/c)(11个字节)
28: -------------------------------------------------------*/
29:         _intjmp_(TaskInit);//TaskInit
C:0x0073    9002DB   MOV      DPTR,#TaskInit(0x02DB)
C:0x0076    1203F3   LCALL    _reset_code__(C:03F3)
--------------------------------------------------------------------
_reset_code__:
C:0x03F3    C082     PUSH     DPTR(0x82)
C:0x03F5    C083     PUSH     DPH(0x83)
C:0x03F7    32       RETI  
33: /*------------------------------------------------------
34:         方法4.函数名调用函数(C语言) (3个字节)
35: -------------------------------------------------------*/
36:         TaskInit();//TaskInit
C:0x008B    1202DB   LCALL    TaskInit(C:02DB)
40: /*------------------------------------------------------
41:         方法5.函数指针数组调用函数(C语言HotIns.h/c和COM接口)(15个字节)
42: -------------------------------------------------------*/
43:         _icall_((void *)iHotTaskTable.pVtbl[0]);//TaskInit
C:0x0097    AB3F     MOV      R3,iHotTaskTable(0x3F)
C:0x0099    AA40     MOV      R2,0x40
C:0x009B    A941     MOV      R1,0x41
C:0x009D    1204FA   LCALL    C?ICALL(C:04FA)           
--------------------------------------------------------------------
C?ICALL:
C:0x04FA    8A83     MOV      DPH(0x83),R2
C:0x04FC    8982     MOV      DPTR(0x82),R1
C?ICALL2:
C:0x04FE    E4       CLR      A
C:0x04FF    73       JMP      @A+DPTR
47: /*------------------------------------------------------
48:         方法6.函数指针数组调用函数(C语言HotIns.h/c和COM接口)(22个字节)
49: -------------------------------------------------------*/
50:         _intjmp_((unsigned int)iHotTaskTable.pVtbl[0]);//TaskInit
C:0x00BB    AB3F     MOV      R3,iHotTaskTable(0x3F)
C:0x00BD    AA40     MOV      R2,0x40
C:0x00BF    A941     MOV      R1,0x41
C:0x00C1    AE02     MOV      R6,0x02
C:0x00C3    AF01     MOV      R7,0x01
C:0x00C5    8E83     MOV      DPH(0x83),R6
C:0x00C7    8F82     MOV      DPTR(0x82),R7
C:0x00C9    1203F3   LCALL    _reset_code__(C:03F3)
--------------------------------------------------------------------
_reset_code__:
C:0x03F3    C082     PUSH     DPTR(0x82)
C:0x03F5    C083     PUSH     DPH(0x83)
C:0x03F7    32       RETI     
54: /*------------------------------------------------------
55:         方法7.函数指针数组调用函数(COM接口函指针数组)(15个字节)
56: -------------------------------------------------------*/
57:         iHotTaskTable.pVtbl[0]();//TaskInit
C:0x00FF    AB3F     MOV      R3,iHotTaskTable(0x3F)
C:0x0101    AA40     MOV      R2,0x40
C:0x0103    A941     MOV      R1,0x41
C:0x0105    1204FA   LCALL    C?ICALL(C:04FA)
--------------------------------------------------------------------
C?ICALL:
C:0x04FA    8A83     MOV      DPH(0x83),R2
C:0x04FC    8982     MOV      DPTR(0x82),R1
C?ICALL2:
C:0x04FE    E4       CLR      A
C:0x04FF    73       JMP      @A+DPTR
61: /*------------------------------------------------------
62:         方法8.函数指针数组调用函数(COM接口函指针名)(15个字节)
63: -------------------------------------------------------*/
64:         iHotTaskTable.lpVtbl.TaskInit();//TaskInit
C:0x0123    AB3F     MOV      R3,iHotTaskTable(0x3F)
C:0x0125    AA40     MOV      R2,0x40
C:0x0127    A941     MOV      R1,0x41
C:0x0129    1204FA   LCALL    C?ICALL(C:04FA)
--------------------------------------------------------------------
C?ICALL:
C:0x04FA    8A83     MOV      DPH(0x83),R2
C:0x04FC    8982     MOV      DPTR(0x82),R1
C?ICALL2:
C:0x04FE    E4       CLR      A
C:0x04FF    73       JMP      @A+DPTR


菜农HotPower@126.com  2009.2.17 4:10 于菜地成功移植COM接口到51后

相关帖子

沙发
Cortex-M0| | 2012-11-5 12:50 | 只看该作者
沙发,顶菜农

使用特权

评论回复
板凳
a20084666| | 2015-7-16 12:19 | 只看该作者
好帖子,赞一个

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:[url=http://www.21ic.com/tools/HotWC3_V1.23.html]

1460

主题

21619

帖子

506

粉丝