函数调用机制
在有返回值的函数调用时先把参数压进栈里还是先把返回值压进栈里
[解决办法]
先把返回地址压进去 像EBP EDI ESI EBX等
再把参数压进去
你可以自己写个函数调试下,看看汇编代码
调用时:
0040B7E0 push ebp
0040B7E1 mov ebp,esp
0040B7E3 sub esp,44h
0040B7E6 push ebx
0040B7E7 push esi
0040B7E8 push edi
0040B7E9 lea edi,[ebp-44h]
0040B7EC mov ecx,11h
0040B7F1 mov eax,0CCCCCCCCh
0040B7F6 rep stos dword ptr [edi]
返回时:
pop edi
0040B80D pop esi
0040B80E pop ebx
0040B80F add esp,44h
0040B812 cmp ebp,esp
0040B814 call __chkesp (00401170)
0040B819 mov esp,ebp
0040B81B pop ebp
如果再详细点,你可以仔细研究下他的地址,地址很紧凑的
特别是栈里面函数调用时
[解决办法]
如果要调用的协议方面的话,LS的已经说的很清楚了
三种
_cdecl 标准C调用 手工清栈 从右到左
stdcall 新标准c/c++调用 自动清栈 从右到左
pascal pascal风格 自动清栈 从左到右
在《编程高手箴言》里讲得比较详细
但是我印象中 标准C是没有规定调用的顺序的,是编译器规定的