函数栈帧(用汇编来剖析)(2)

int a = 0xaaaa; 00A1190B mov dword ptr [a],0AAAAh int b = 0xbbbb; 00A11912 mov dword ptr [b],0BBBBh

赋值阶段,这里给了双字,所以是dword 通过指针赋值~,ptr就是指针,mov dst src就是把后面的给前面的,就是dst=src这样的

1 func(a, b); 2 00A11919 mov eax,dword ptr [b] 3 00A1191C push eax 联合上一句的赋值语句构成参数压栈 y=b 4 00A1191D mov ecx,dword ptr [a] 5 00A11920 push ecx 联合上一句的赋值语句构成参数压栈 x=a 6 00A11921 call func (0A11366h) call函数调用,把fun函数的地址call一下 7 00A11926 add esp,8 push了这么多不得把栈顶指针挪一挪?

重头戏来了,这就是这次要讲述的主要部分,函数调用时候的栈帧!令人惊讶的是传的实参是放在main函数栈帧中的。我们来结合func的汇编看一下

1 int func(int x, int y) 2 { 3 00A11770 push ebp 4 00A11771 mov ebp,esp 5 00A11773 sub esp,0D8h 6 00A11779 push ebx 7 00A1177A push esi 8 00A1177B push edi 9 00A1177C lea edi,[ebp-0D8h] 10 00A11782 mov ecx,36h 11 00A11787 mov eax,0CCCCCCCCh 12 00A1178C rep stos dword ptr es:[edi] 13 int *p = &x; 14 00A1178E lea eax,[x] 15 00A11791 mov dword ptr [p],eax 16 p--; 17 00A11794 mov eax,dword ptr [p] 18 00A11797 sub eax,4 19 00A1179A mov dword ptr [p],eax 20 *p = (int)bug; 21 00A1179D mov eax,dword ptr [p] 22 00A117A0 mov dword ptr [eax],offset bug (0A1127Bh) 23 printf("x:%d,y:%d\n", x, y); 24 00A117A6 mov eax,dword ptr [y] 25 00A117A9 push eax 26 00A117AA mov ecx,dword ptr [x] 27 00A117AD push ecx 28 00A117AE push offset string "x:%d,y:%d\n" (0A16B3Ch) 29 00A117B3 call _printf (0A1132Ah) 30 00A117B8 add esp,0Ch 31 int c = 0xcccc; 32 00A117BB mov dword ptr [c],0CCCCh 33 return c; 34 00A117C2 mov eax,dword ptr [c] 35 }

1 int func(int x, int y) 2 { 3 00A11770 push ebp 4 00A11771 mov ebp,esp 5 00A11773 sub esp,0D8h 6 00A11779 push ebx 7 00A1177A push esi 8 00A1177B push edi 9 00A1177C lea edi,[ebp-0D8h] 10 00A11782 mov ecx,36h 11 00A11787 mov eax,0CCCCCCCCh 12 00A1178C rep stos dword ptr es:[edi]

没错了这一部分就是保存main函数的状态了,至于它保存了哪些main函数的状态,通过哪些寄存器保存的这里就不详细说明了(使用push命令的一般都是保存状态用的),刚才说的在这里上图,按步骤阅读更佳

函数栈帧(用汇编来剖析)

函数栈帧(用汇编来剖析)

这是func头两步的汇编指令

1 00A11770 push ebp 2 00A11771 mov ebp,esp

分别是把返回main函数的地址就是push ebp啦,压栈!,然后把栈顶指针赋值给栈底指针,就把栈底挪过来了,这就是新的栈底了!!因为main栈帧已经告一段落了

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/de7d63afeafdd075c8461624b8ec8183.html