失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Keil C51中一个C函数被8种方法调用及效率反汇编

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

时间:2019-09-17 20:41:18

相关推荐

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

(-07-27)

KeilC51中一个C函数被8种方法调用及效率反汇编 -4-16 5:23:00

0

作者:菜农HotPower@

下面的主函数里用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

如果觉得《Keil C51中一个C函数被8种方法调用及效率反汇编》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。