今天突然看到了内联函数这块,出于好奇心,想看看这块的原理。
所以就写了一份代码:
#include <stdio.h>
#include <windows.h>
int func(int a);
__inline int func(int a)
{
return a*5;
}
void main()
{
int i = 2;
int j;
getchar();
j = func(i);
printf("The int = %d",j);
}
然后在反汇编的时候发现inline在汇编里面并没有被展开,一直不得解,求教。
0040DE50 |. 83C4 04 ADD ESP,4
0040DE53 |. 8945 F4 MOV DWORD PTR SS:[EBP-C],EAX
0040DE56 |> 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
0040DE59 |. 51 PUSH ECX
0040DE5A |. E8 B031FFFF CALL constDeb.0040100F //这里就是调用的func
0040DE5F |. 83C4 04 ADD ESP,4
0040DE62 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
0040DE65 |. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
0040DE68 |. 52 PUSH EDX ; /<%d>
0040DE69 |. 68 1C304200 PUSH OFFSET constDeb.??_C@_0N@JANE@The?5>; |format = "The int = %d"
0040DE6E |. E8 9D32FFFF CALL constDeb.printf ; \printf
00401050 >/> \55 PUSH EBP
00401051 |. 8BEC MOV EBP,ESP
00401053 |. 83EC 40 SUB ESP,40
00401056 |. 53 PUSH EBX
00401057 |. 56 PUSH ESI
00401058 |. 57 PUSH EDI
00401059 |. 8D7D C0 LEA EDI,DWORD PTR SS:[EBP-40]
0040105C |. B9 10000000 MOV ECX,10
00401061 |. B8 CCCCCCCC MOV EAX,CCCCCCCC
00401066 |. F3:AB REP STOS DWORD PTR ES:[EDI]
00401068 |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
0040106B |. 6BC0 05 IMUL EAX,EAX,5
0040106E |. 5F POP EDI
0040106F |. 5E POP ESI
00401070 |. 5B POP EBX
00401071 |. 8BE5 MOV ESP,EBP
00401073 |. 5D POP EBP
00401074 \. C3 RETN
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课