|
发表于 2023-9-21 17:27:29
|
显示全部楼层
广西壮族自治区柳州市
win平台32位程序中,函数调用时有多种约定,其中使用较多的是stdcall 和 cdecl
大部分取winapi都是用的stdcall易语言默认也是stdcall stdcall 约定是被调用者清栈
栈其实就是一段内存 当前指针保存在工esp里,假如当前栈指针为100,现在需要调用一个函数,函数有2个参数,每个占4字节
push xx 把一个参数压入栈中内部运作就是 esp=esp-4 当前指针就变成了96 96-100中就存放一个4字节数据
push xx 再把一个参数压入栈中 又一次 esp=esp-4
call 函数
假如这个函数是stdcall调用约定那它最后一句汇编代码必然是其基retn 8 也就相当于 esp=esp+8 让栈指针灰复到压入参数前的100
假如这个函数调用约定是cdecl 的话 它最后一句只是ret 并没有平栈 返回后栈指针已然是92 这时候返回后第一时间add esp,8(esp=esp+8) 达到平栈效果
不在库函数前+@易语言并不知道这个是cdecl 就默认当于stdcall 处理,编译器在编译成二进制时就不会在后面加 add esp,8 ,返回到上一层函数时,栈指针就乱套了
|
|