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