[セットトップ]C++逆アセンブリ->テンプレート解析

6005 ワード

テンプレートコードは次のとおりです.
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

小結:テンプレート関数に対して、異なるパラメータタイプ、そのアセンブリコードはそれぞれ独立していて、テンプレートの原意と似ていて、規則を確立して、使うとコンパイルして、使わないとコンパイルしません.