首页
论坛
课程
招聘
[求助]为什么stdcall的方式的函数,参数是不可变的?
2020-5-7 16:50 1406

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

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