由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 再请教个:C变长参数的传递问题
相关主题
关于判断stack grows up or down那道题Apple的一些C++概念题
借人气问个C递归函数的问题问一道c++面试题
G recruiter问面试语言求一面试题解答
几个C语言的题目贴两道面试题
BB 一个电面题没有offer郁闷, 有offer头疼.(伤人品)
汗,不问算法请问如果要求in place的话,递归是不是就不能用了?
请教一个入门级的C的指针问题c++中rand() 这个函数怎么实现的?
问个C/C++概念的问题也报一个Bloomberg offer
相关话题的讨论汇总
话题: 参数话题: bp话题: 函数话题: sp话题: 变长
进入JobHunting版参与讨论
1 (共1页)
l******d
发帖数: 530
1
比如printf()这种变长参数个数的函数,调用是stack里是需要push哪些东西的,跟普通的定长
参数函数调用有何不同呢?谢谢
G******e
发帖数: 229
2
Use the varargs facility: #include
l******d
发帖数: 530
3
那运行时push什么进stack呢?跟普通的定长参数函数调用有不同吗?谢谢。

【在 G******e 的大作中提到】
: Use the varargs facility: #include
G******e
发帖数: 229
4

Sorry, I know little about the implementation of this facility. It seems the
implementation is compiler-dependent, see e.g. http://gcc.gnu.org/onlinedocs/gccint/Varargs.html.

【在 l******d 的大作中提到】
: 那运行时push什么进stack呢?跟普通的定长参数函数调用有不同吗?谢谢。
d***p
发帖数: 128
5
以前刚好写过printf这个函数。“”内的参数是以字符串的形式存在,到stack的是它
的地址,当然你可以随便写内容了。之后的参数就反方向入stack。再之后PC,FP,函数
里的变量入stack。欢迎讨论
c******e
发帖数: 545
6
这种函数都是__cdecl调用,参数从右向左压栈,主调函数清栈。
format string在最左(printf)或次左(fprintf,sprintf...),所以用[BP]访问的时候
位置可预测,然后根据format string生成每个参数的偏移地址。
一般来说函数调用大致顺序(__cdecl)是:
1.主调函数从右到左压参数
2.建立栈帧
1)保存BP(32位下EBP,下同)push bp
2)保存当前栈位置:mov bp,sp
因为BP和SP默认同时用栈段(SS),用BP上可访问参数,下可访问局部变量,一般不用
SP,因为SP总是在变。
3.函数体
4.恢复bp:mov sp,bp pop bp
4.函数返回
5.主函数清栈(xxx是参数大小):add sp,xxx
时间太久可能细节不太准确,不过大致过程应该差不多,可以使用变长参数的两个决定
因素是:1. 右到左压栈 2. 主调函数清栈
c******e
发帖数: 545
7
如果有局部变量的话还要修改sp来reserve空间:
sub sp, yyy
1 (共1页)
进入JobHunting版参与讨论
相关主题
也报一个Bloomberg offerBB 一个电面题
弱问1个python 语法汗,不问算法
C++疑问:Animal a,Animal* a,哪种访问方式快请教一个入门级的C的指针问题
函数被调用过程到底发生什么?问个C/C++概念的问题
关于判断stack grows up or down那道题Apple的一些C++概念题
借人气问个C递归函数的问题问一道c++面试题
G recruiter问面试语言求一面试题解答
几个C语言的题目贴两道面试题
相关话题的讨论汇总
话题: 参数话题: bp话题: 函数话题: sp话题: 变长