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

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

 这就是扩展函数栈帧的方式啦,将栈顶指针往后挪动一定的位置1 00A11773 sub esp,0D8h  ,这里挪动了D8(16进制),剩下的部分就是保存寄存器状态了,我就不讲了

 

简单来说,两个栈帧的大概情况就是这样的

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

所以很简单,我们不必通过y=100这样的语句就可以对y进行赋值改下代码就好

1 int func(int x, int y) 2 { 3 int *p = &x; 4 p++; 5 *p = 100; 6 printf("x:%d,y:%d\n", x, y); 7 int c = 0xcccc; 8 return c; 9 }

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

别着急!还没结束!汇编解释来了!

1 int *p = &x; 2 0009178E lea eax,[x] 这就是取偏移地址,取得x对于当前ebp的偏移地址 3 00091791 mov dword ptr [p],eax 简单赋值 4 p--; 5 00091794 mov eax,dword ptr [p] 看他把寄存器来回赋值的,其实就是将把地址减个4 6 00091797 sub eax,4 7 0009179A mov dword ptr [p],eax 8 *p = (int)bug; 9 0009179D mov eax,dword ptr [p] 把函数bug的地址传过来赋值 10 000917A0 mov dword ptr [eax],offset bug (09127Bh) offset也是取偏移的作用还是和lea有些不同的 11 printf("x:%d,y:%d\n", x, y); 12 000917A6 mov eax,dword ptr [y] 这就不说了是个系统调用,因为我也不是很懂 13 000917A9 push eax 14 000917AA mov ecx,dword ptr [x] 15 000917AD push ecx 16 000917AE push offset string "x:%d,y:%d\n" (096B3Ch) 17 000917B3 call _printf (09132Ah) 18 000917B8 add esp,0Ch 19 int c = 0xcccc; 20 000917BB mov dword ptr [c],0CCCCh 创建的局部变量位置在ebp下面~看图! 21 return c; 22 000917C2 mov eax,dword ptr [c]

没看到形参对不对?就两个实参,写完了不就改了么?不对哦~

x = 10; 000A178E mov dword ptr [x],0Ah y = 10; 000A1795 mov dword ptr [y],0Ah

我把代码改成这样看会变,这里并没有更改之前保存的寄存器里的东西,是取得了新的部分哦

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

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