能力值:
( LV9,RANK:610 )
2 楼
第一个例子之所以不会崩溃是因为被调用的函数没有参数,也就不存在堆栈平衡的问题 你加一个参数试试,看他崩溃不崩溃
ps.讲解堆栈平衡 如果不结合反汇编码来看的话 终究是留着层面上 不能深入
能力值:
( LV3,RANK:20 )
3 楼
Thinking low level, writing high level
能力值:
( LV3,RANK:20 )
4 楼
楼主的钻研精神可嘉,对于有参数的函数,__cdecl和__stdcall错不得!
你可以通过控制编译选项,让编译器为调用者函数main建立栈结构, 从而使main函数的栈是平的。但你忽视了错误使用__cdecl和__stdcall的结果不止是可能给main函数带来栈不平,更大的风险是它破坏了调用的上下文:
将__cdecl函数作为__stdcall调用会使栈指针向栈顶方向移,结果是如果有后续的POP,则得到错误的值;
将__stdcall函数作为__cdecl调用,则会使栈指针向栈底方向移,甚至可能超过函数栈,如果后续有PUSH,则会破坏栈中的内容,也许你的main函数的返回地址已被修改,这是灾难性的。
以上两种情况都造成隐性“越界”,会给程序造成非常难查的错误!
能力值:
( LV2,RANK:10 )
5 楼
谢谢分享了,很有帮助
能力值:
( LV2,RANK:10 )
6 楼
谢谢分享,学习了
能力值:
( LV2,RANK:10 )
7 楼
谢谢楼主,学习了。
能力值:
( LV2,RANK:10 )
8 楼
编译环境:VC++6.0
编译方式:Debug
24: StdCallFUN(1,'1',1.0f,1.0); //stdcall调用特征:纯堆栈传参
00401198 push 3FF00000h
0040119D push 0
0040119F push 3F800000h
004011A4 push 31h
004011A6 push 1
004011A8 call @ILT+5(StdCallFUN) (0040100a)
25: FastCallFUN(1,'1',1.0f,1.0);//fastCall调用特征:堆栈和寄存器传参
004011AD push 3FF00000h
004011B2 push 0
004011B4 push 3F800000h
004011B9 mov dl,31h
004011BB mov ecx,1
004011C0 call @ILT+15(FastCallFUN) (00401014)
26: CdeclCallFUN(1,'1',1.0f,1.0);//cdecl调用特征:堆栈传参,堆栈平衡
004011C5 push 3FF00000h
004011CA push 0
004011CC push 3F800000h
004011D1 push 31h
004011D3 push 1
004011D5 call @ILT+0(CdeclCallFUN) (00401005)
004011DA add esp,14h
能力值:
( LV2,RANK:10 )
9 楼
支持楼主谢谢了