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