打印

半夜**叫沙发肯定自己坐,看谁比菜农更非典???

[复制链接]
4142|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2009-2-17 04:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面的主函数里用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后

相关帖子

沙发
hotpower|  楼主 | 2009-2-17 04:23 | 只看该作者

半夜**叫沙发肯定自己坐,看谁比菜农更非典???


使用特权

评论回复
板凳
quakegod| | 2009-2-17 05:03 | 只看该作者

山人来坐板凳

使用特权

评论回复
地板
HotPower| | 2009-2-17 08:25 | 只看该作者

俺想和人PK用过多少种调用函数的方法~~~要求置顶“悬梁此帖


uC/OS-II任务调度的改进与实现-摘自《现代电子技术》半月刊2006年第14期在各种嵌入式操作系统中,其任务切换带来的延时窗口町以说是最小的之一,非常适合强实时性的任务要求。但对大部分周期性和实时性要求不高的任务来说,弘C/()s一Ⅱ还 ...
www.gotoread.com/vo/60/page190925.html - 15k - 网页快照 - 类似网页  

使用特权

评论回复
5
notpower| | 2009-2-17 14:21 | 只看该作者

“茴"字有四种写法?

使用特权

评论回复
6
Airwill| | 2009-2-17 17:32 | 只看该作者

晕了

  强烈** hotpower 的"四个眼睛"!

来两下可以哦, 怎么没完没了了呢!

言归正传: 我倒是不太喜欢这么偏门的调用. 
因为这样的调用会影响编译器的寄存器优化算法, 这对效率更有影响!

使用特权

评论回复
7
strang| | 2009-2-17 18:32 | 只看该作者

晕啊??

使用特权

评论回复
8
hotpower|  楼主 | 2009-2-17 18:42 | 只看该作者

反对无效!!!

uC/OS-II任务调度的改进与实现-摘自《现代电子技术》半月刊2006年第14期在各种嵌入式操作系统中,其任务切换带来的延时窗口町以说是最小的之一,非常适合强实时性的任务要求。但对大部分周期性和实时性要求不高的任务来说,弘C/()s一Ⅱ还 ...
www.gotoread.com/vo/60/page190925.html - 15k - 网页快照 - 类似网页  

使用特权

评论回复
9
Airwill| | 2009-2-17 19:20 | 只看该作者

得到看这图不晕的一法, 大家试试

  1. 用一个眼睛看;
  2. 头侧过来, 转过 90°再看.

使用特权

评论回复
10
HotTask51| | 2009-2-17 19:22 | 只看该作者

哈哈~~~俺就是要得这“效果”~~~

使用特权

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

本版积分规则

1460

主题

21619

帖子

506

粉丝