c语言调用函数汇编分析,汇编语言分析C语言的函数调用过程

1 __RTC_Initialize:2 01091145jmp _RTC_Initialize (01092D40h)3 __controlfp_s:4 0109114A jmp __controlfp_s (0109376Ch)5 _GetSystemTimeAsFileTime@4:6 0109114F jmp _GetSystemTimeAsFileTime@4(01093C22h)7 add:8 01091154h jmp add (010913C0h)9 _DecodePointer@4:10 01091159 jmp _DecodePointer@4(01093C28h)11 __invoke_watson:12 0109115E jmp __invoke_watson (01093766h)13 ___report_rangecheckfailure:14 01091163jmp __report_rangecheckfailure (01093940h)15 _RTC_GetSrcLine:16 01091168jmp _RTC_GetSrcLine (010933D0h)17 __wmakepath_s:18 0109116D jmp __wmakepath_s (0109377Eh)19 __CRT_RTC_INITW:20 01091172jmp __CRT_RTC_INITW (0109262Ch)21

22 #include

23

24 //调用函数add的地址

25 int add(int a, int b, intc)26 {27 010913C0 push ebp     ;ebp=0030FB10 esp=0030FA0028 010913C1 mov ebp,esp ;ebp=0030FA0029 010913C3 sub esp,0C0h ;esp=0030F94030 010913C9 push ebx      ;保护现场,esp=0030F93C31 010913CA push esi      ;esp=0030F93832 010913CB push edi      ;edi=0030FB10, esp=0030F93433 010913CC lea edi,[ebp-0C0h] ;edi=0030F94034 010913D2 mov ecx,30h     ;初始化35 010913D7 mov eax,0CCCCCCCCh36 010913DC rep stos dword ptr es:[edi]37 return (a+b+c);38 010913DE mov eax,dword ptr [a] ;取参数值,并计算39 010913E1 add eax,dword ptr [b]40 010913E4 add eax,dword ptr [c]41 }42 010913E7 pop edi ;恢复现场 edi=0030FB10, esp=0030F93843 010913E8 pop esi   ;esp=0030F93C44 010913E9 pop ebx ;esp=0030F94045 }46 010913EA mov esp,ebp ;esp=0030FA0047 010913EC pop ebp ;ebp=0030FB10, esp=0030FA0448 010913ED ret ;esp=0030FA08 【__cdecl】调用方式内部没有平衡栈,由调用者负责平栈(编译器自动处理),【__stdcall】调用方式指令“return 0Ch”内部平栈49

50 //主调函数

51 int main(int argc, char *argv[])52 {53 01091400 push ebp ;将ebp内容压栈 ebp=0030FB60 esp=0030FB1454 01091401 mov ebp,esp ;esp传给ebp ebp=0030FB10 esp=0030FB1055 01091403 sub esp,0F0h ;改变栈顶值,腾出空间,esp=esp-0F0h esp=0030FA2056 01091409 push ebx ;压栈ebx,esi,edi,保护现场. ebp=0030FB10 esp=0030FA1C57 0109140A push esi ;esp=0030FA1858 0109140B push edi    ;esp=0030FA1459 0109140C lea edi,[ebp-0F0h] ;将(ebp-0F0h)=0030FA20的值放入edi中,edi=0030FA2060 01091412 mov ecx,3Ch ;ecx=3Ch,rep指令循环次数61 01091417 mov eax,0CCCCCCCCh ;eax=CCCCCCCC62 0109141C rep stos dword ptr es:[edi] ;重复填充CCCCCCCC,(3Ch)次63 int sum = 0;64 0109141E mov dword ptr [sum],0 ;&sum=0030fb08, sum=0

65 int a = 1;66 01091425 mov dword ptr [a],1 ;&a=0030fafc, a=1

67 int b = 2;68 0109142C mov dword ptr [b],2 ;&b=0030faf0, b=2

69 int c = 3;70 01091433 mov dword ptr [c],3 ;&c=0030fae4, c=3

71 sum =add(a,b,c);72 0109143A mov eax,dword ptr [c] ;参数按从右至左的顺序压栈, eax=3

73 0109143D push eax          ;esp=0030FA1074 0109143E mov ecx,dword ptr [b] ;ecx=2

75 01091441 push ecx          ;esp=0030FA0C76 01091442 mov edx,dword ptr [a] ;edx=1

77 01091445 push edx          ;esp=0030FA0878 01091446call add (01091154h) ;调用函数add,此时会将返回函数的下一指令地址0109144B压栈,调用前esp=0030FA04,调用后esp=0030FA0879 0109144B add esp,0Ch        ;esp=0030FA14 【__cdecl】调用方式调用返回后外部平栈,【__stdcall】调用方式没有这条指令80 0109144E mov dword ptr [sum],eax ;将值传给变量sum81 return 0;82 01091451xor eax,eax83 }84 01091453pop edi   ;恢复现场85 01091454pop esi86 }87 01091455pop ebx ;esp=0030FA2088 01091456add esp,0F0h ;esp=0030FB1089 0109145C cmp ebp,esp90 0109145E call __RTC_CheckEsp (01091136h)91 01091463mov esp,ebp92 01091465pop ebp ;ebp=0030FB60 esp=0030FB1493 01091466 ret ;esp=0030FB18

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值