C++反汇编->模板分析

模板代码如下:

template<typename T>
int add(T i,T j)
{
	return i+j;
}


主函数:

void main()
{
	std::cout<<"tip1";
	std::cout<<add(12,34)<<std::endl;
	std::cout<<add(double(12),double(34));
	std::cout<<add(float(12),float(34));
	system("pause");
}
对应调用函数DEBUG如下:

00401590 > > \55            PUSH EBP
00401591   .  8BEC          MOV EBP,ESP
00401593   .  83EC 40       SUB ESP,40
00401596   .  53            PUSH EBX
00401597   .  56            PUSH ESI
00401598   .  57            PUSH EDI                                 ;  tip1
00401599   .  8D7D C0       LEA EDI,DWORD PTR SS:[EBP-40]
0040159C   .  B9 10000000   MOV ECX,10
004015A1   .  B8 CCCCCCCC   MOV EAX,CCCCCCCC
004015A6   .  F3:AB         REP STOS DWORD PTR ES:[EDI]
004015A8   .  68 24004700   PUSH OFFSET testtemp.??_C@_04HPCL@tip1?$>;  tip1
004015AD   .  68 A0DE4700   PUSH OFFSET testtemp.std::cout
004015B2   .  E8 DDFCFFFF   CALL testtemp.00401294
004015B7   .  83C4 08       ADD ESP,8
004015BA   .  68 C8104000   PUSH testtemp.004010C8
004015BF   .  6A 22         PUSH 22
004015C1   .  6A 0C         PUSH 0C
004015C3   .  E8 3CFBFFFF   CALL testtemp.00401104
004015C8   .  83C4 08       ADD ESP,8
004015CB   .  50            PUSH EAX                                 ;  输出 int 类型
004015CC   .  B9 A0DE4700   MOV ECX,OFFSET testtemp.std::cout
004015D1   .  E8 29FBFFFF   CALL testtemp.004010FF
004015D6   .  8BC8          MOV ECX,EAX
004015D8   .  E8 08FCFFFF   CALL testtemp.004011E5
004015DD   .  68 00004140   PUSH 40410000
004015E2   .  6A 00         PUSH 0
004015E4   .  68 00002840   PUSH 40280000
004015E9   .  6A 00         PUSH 0
004015EB   .  E8 FFFBFFFF   CALL testtemp.004011EF
004015F0   .  83C4 10       ADD ESP,10
004015F3   .  50            PUSH EAX                                 ;  输出 double 类型
004015F4   .  B9 A0DE4700   MOV ECX,OFFSET testtemp.std::cout
004015F9   .  E8 01FBFFFF   CALL testtemp.004010FF
004015FE   .  68 00000842   PUSH 42080000
00401603   .  68 00004041   PUSH 41400000
00401608   .  E8 DDFBFFFF   CALL testtemp.004011EA
0040160D   .  83C4 08       ADD ESP,8
00401610 > .  50            PUSH EAX                                 ;  输出 float 类型
00401611   .  B9 A0DE4700   MOV ECX,OFFSET testtemp.std::cout
00401616   .  E8 E4FAFFFF   CALL testtemp.004010FF
0040161B   .  68 1C004700   PUSH OFFSET testtemp.??_C@_05PBCN@pause?>; /pause
00401620   .  E8 4BF40100   CALL testtemp.system                     ; \system
00401625   .  83C4 04       ADD ESP,4
00401628   .  5F            POP EDI
00401629   .  5E            POP ESI
0040162A   .  5B            POP EBX
0040162B   .  83C4 40       ADD ESP,40
0040162E   .  3BEC          CMP EBP,ESP
00401630   .  E8 FBF50100   CALL testtemp.__chkesp
00401635   .  8BE5          MOV ESP,EBP
00401637   .  5D            POP EBP
00401638   .  C3            RETN


std::cout<<add(12,34)<<std::endl;
对应调用函数DEBUG如下:

00402E20 >/> \55            PUSH EBP
00402E21  |.  8BEC          MOV EBP,ESP
00402E23  |.  83EC 40       SUB ESP,40
00402E26  |.  53            PUSH EBX
00402E27  |.  56            PUSH ESI
00402E28  |.  57            PUSH EDI
00402E29  |.  8D7D C0       LEA EDI,DWORD PTR SS:[EBP-40]
00402E2C  |.  B9 10000000   MOV ECX,10
00402E31  |.  B8 CCCCCCCC   MOV EAX,CCCCCCCC
00402E36  |.  F3:AB         REP STOS DWORD PTR ES:[EDI]
00402E38  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
00402E3B  |.  0345 0C       ADD EAX,DWORD PTR SS:[EBP+C]
00402E3E  |.  5F            POP EDI
00402E3F  |.  5E            POP ESI
00402E40  |.  5B            POP EBX
00402E41  |.  8BE5          MOV ESP,EBP
00402E43  |.  5D            POP EBP
00402E44  \.  C3            RETN


	std::cout<<add(double(12),double(34));
对应调用函数DEBUG如下:
00402E50 >/> \55            PUSH EBP
00402E51  |.  8BEC          MOV EBP,ESP
00402E53  |.  83EC 40       SUB ESP,40
00402E56  |.  53            PUSH EBX
00402E57  |.  56            PUSH ESI
00402E58  |.  57            PUSH EDI
00402E59  |.  8D7D C0       LEA EDI,DWORD PTR SS:[EBP-40]
00402E5C  |.  B9 10000000   MOV ECX,10
00402E61  |.  B8 CCCCCCCC   MOV EAX,CCCCCCCC
00402E66  |.  F3:AB         REP STOS DWORD PTR ES:[EDI]
00402E68  |.  DD45 08       FLD QWORD PTR SS:[EBP+8]
00402E6B  |.  DC45 10       FADD QWORD PTR SS:[EBP+10]
00402E6E  |.  E8 69E40100   CALL testtemp.__ftol
00402E73  |.  5F            POP EDI                                  ;  missing locale facet
00402E74  |.  5E            POP ESI
00402E75  |.  5B            POP EBX
00402E76  |.  8BE5          MOV ESP,EBP
00402E78  |.  5D            POP EBP
00402E79  \.  C3            RETN


std::cout<<add(float(12),float(34));
对应调用函数DEBUG如下:

00402E50 >/> \55            PUSH EBP
00402E51  |.  8BEC          MOV EBP,ESP
00402E53  |.  83EC 40       SUB ESP,40
00402E56  |.  53            PUSH EBX
00402E57  |.  56            PUSH ESI
00402E58  |.  57            PUSH EDI
00402E59  |.  8D7D C0       LEA EDI,DWORD PTR SS:[EBP-40]
00402E5C  |.  B9 10000000   MOV ECX,10
00402E61  |.  B8 CCCCCCCC   MOV EAX,CCCCCCCC
00402E66  |.  F3:AB         REP STOS DWORD PTR ES:[EDI]
00402E68  |.  DD45 08       FLD QWORD PTR SS:[EBP+8]
00402E6B  |.  DC45 10       FADD QWORD PTR SS:[EBP+10]
00402E6E  |.  E8 69E40100   CALL testtemp.__ftol
00402E73  |.  5F            POP EDI                                  ;  missing locale facet
00402E74  |.  5E            POP ESI
00402E75  |.  5B            POP EBX
00402E76  |.  8BE5          MOV ESP,EBP
00402E78  |.  5D            POP EBP
00402E79  \.  C3            RETN

小结:对于模板函数,不同的参数类型,其汇编代码都各自独立,也与模板的原意类似,建立一套规则,用到就编译,没用到就不编译。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值