首页
社区
课程
招聘
未解决 [求助]为什么stdcall的方式的函数,参数是不可变的?
发表于: 2020-5-7 16:50 2360

未解决 [求助]为什么stdcall的方式的函数,参数是不可变的?

2020-5-7 16:50
2360

想不通这里面的原理,谁能简单说说原因,谢谢大佬。


[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 174
活跃值: (181)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
你理解一下 stdcall是一个标准.规定了这样去做.  因为在 windows上 你写一个dll 或者做一个com组件. 不是stdcall 别的程序调用会出现问题. 一种规定. 还有你说的参数不可变我没理解什么意思. 是参数要固定吗.还是说不能有可变参数? 如果说的可变参数的话 stdcall是不知道你传入了多少个参数的. 所以调用call的人才知道.所以才有外平栈. call完之后 才会有 add esp,xxx 
2020-5-7 18:12
1
雪    币: 5514
活跃值: (2254)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
IBinary 你理解一下 stdcall是一个标准.规定了这样去做. 因为在 windows上 你写一个dll 或者做一个com组件. 不是stdcall 别的程序调用会出现问题. 一种规定. 还有你说的参数不可 ...
+5 谢谢大佬,如果把printf定义成_stdcall,是不是就无法实现可变参数了呢?
2020-5-7 18:55
0
雪    币: 10176
活跃值: (4395)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
__cdecl 和__stdcall 函数参数都是从右到左入栈,它们的区别在于由谁来清栈,__cdecl 由外部调用函数清栈,而__stdcall 由被调用函数本身清栈, 显然对于可变参数的函数,函数本身没法知道外部函数调用它时传了多少参数,所以没法支持被调用函数本身清栈 (__stdcall), 所以可变参数只能用__cdecll
2020-5-7 21:33
1
雪    币: 5514
活跃值: (2254)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
Willarcap __cdecl 和__stdcall 函数参数都是从右到左入栈,它们的区别在于由谁来清栈,__cdecl 由外部调用函数清栈,而__stdcall 由被调用函数本身清栈, 显然对于可变参数的函数,函数 ...
+5 万分感谢,看大佬的解答,又在大脑中过了几遍,好像懂了。
2020-5-7 21:44
0
雪    币: 631
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
可变参数, 参数虽然看似自由, 但是有限定条件, 比如 printf的格式字串 "%s %d\n" 后续参数为2个. 若参数不足有可能会破坏栈环境.
x86环境下, 栈堆恢复方式可以看出来
_cdecl      retn 上层sub exp, 4*参数个数
__stdcall   ret 4*参数个数
2020-5-8 17:17
1
雪    币: 5514
活跃值: (2254)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
linyifeng 可变参数, 参数虽然看似自由, 但是有限定条件, 比如 printf的格式字串 "%s %d\n" 后续参数为2个. 若参数不足有可能会破坏栈环境. x86环境下, 栈堆恢复方式 ...
+5 谢谢大佬,万分感谢!
2020-5-8 20:03
0
游客
登录 | 注册 方可回帖
返回
//