由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 再请教个:C变长参数的传递问题 (转载)
相关主题
[合集] 几道面试问题C++ questions
[合集] call-by-ref降低了C++程序可读性heap&stack Linux vs. Windows
请教一个程序调用的内存问题 (转载)Python 中如何调用C的 exe 程序
请教c++里函数调用的问题请教c++ 类 内外的 同名函数问题
有没有什么软件可以visualize代码间函数调用的关系?C++中怎么传递std::hex这样的参数啊
类成员函数调用其它函数当某个函数被调用的时候,需要定义一个宏
[合集] 请问是不是所有编程语言的函数调用,Matlab/C++/Java/DelphC/C++函数调用和栈内存
出个题考考大家:)请问有没有用过IMSL库的大虾? (转载)
相关话题的讨论汇总
话题: 参数话题: 变长话题: 函数调用话题: stack话题: cdecl
进入Programming版参与讨论
1 (共1页)
l******d
发帖数: 530
1
比如printf()这种变长参数个数的函数,调用是stack里是需要push哪些东西的,跟普通的定长
参数函数调用有何不同呢?谢谢
t****t
发帖数: 6806
2
you need to know the address of 1st parameter, so the only sensible order is
from back to front.

【在 l******d 的大作中提到】
: 比如printf()这种变长参数个数的函数,调用是stack里是需要push哪些东西的,跟普通的定长
: 参数函数调用有何不同呢?谢谢

l******d
发帖数: 530
3
多谢了,再问下,这种变长参数的函数调用,往stack里push的东西,和普通的定长参
数函数调用有区别吗?对定长参数函数调用,stack里push的就是寄存器和参数,对变
长参数函数调用而言,会有什么特殊处理吗?

is

【在 t****t 的大作中提到】
: you need to know the address of 1st parameter, so the only sensible order is
: from back to front.

d****n
发帖数: 1637
4
不是变长,function parameters 就留个开始地址,剩下的都在caller里面呢。

【在 l******d 的大作中提到】
: 多谢了,再问下,这种变长参数的函数调用,往stack里push的东西,和普通的定长参
: 数函数调用有区别吗?对定长参数函数调用,stack里push的就是寄存器和参数,对变
: 长参数函数调用而言,会有什么特殊处理吗?
:
: is

X****r
发帖数: 3557
5
你觉得会需要什么样的特殊处理呢?

【在 l******d 的大作中提到】
: 多谢了,再问下,这种变长参数的函数调用,往stack里push的东西,和普通的定长参
: 数函数调用有区别吗?对定长参数函数调用,stack里push的就是寄存器和参数,对变
: 长参数函数调用而言,会有什么特殊处理吗?
:
: is

t****t
发帖数: 6806
6
你知道你在说什么吗? 我不知道...

【在 d****n 的大作中提到】
: 不是变长,function parameters 就留个开始地址,剩下的都在caller里面呢。
l******d
发帖数: 530
7
我觉得variable length arguments和fixed length arguments的call stack没啥两样
,两种情况要push的无非就是寄存器和arguments吧。但最近准备面试题时碰到这题,
不知道我是不是漏了什么没考虑。

【在 X****r 的大作中提到】
: 你觉得会需要什么样的特殊处理呢?
d****n
发帖数: 1637
8
who care you?

【在 t****t 的大作中提到】
: 你知道你在说什么吗? 我不知道...
l******d
发帖数: 530
9
莫生气莫生气,讨论问题而已。可能中文变长有歧义,我是指variable length
arguments.

【在 d****n 的大作中提到】
: who care you?
X****r
发帖数: 3557
10
基本上就是这样了。要注意这个其实是ABI 的一部分,所以完全取决于具体的体系结
构/ 平台。比如可以让被调用者负责保持某 些寄存器,以及用寄存器而不是栈来传递
前 若干 个参数。

【在 l******d 的大作中提到】
: 我觉得variable length arguments和fixed length arguments的call stack没啥两样
: ,两种情况要push的无非就是寄存器和arguments吧。但最近准备面试题时碰到这题,
: 不知道我是不是漏了什么没考虑。

相关主题
类成员函数调用其它函数C++ questions
[合集] 请问是不是所有编程语言的函数调用,Matlab/C++/Java/Delphheap&stack Linux vs. Windows
出个题考考大家:)Python 中如何调用C的 exe 程序
进入Programming版参与讨论
a9
发帖数: 21638
11
搭车问个问题。
这个变长数组。我在一个mips上,kernel 2.4.17_mvl21-malta-mips_fp_le
uClibc-0.9.19上,取最后一个固定参数的指针,取出来的是main函数的指针位置。
结果参数都取不到值。不知道有没有解决方案?

两样
题,

【在 X****r 的大作中提到】
: 基本上就是这样了。要注意这个其实是ABI 的一部分,所以完全取决于具体的体系结
: 构/ 平台。比如可以让被调用者负责保持某 些寄存器,以及用寄存器而不是栈来传递
: 前 若干 个参数。

S**I
发帖数: 15689
12
对参数个数可变的函数,调用结束后要由caller function来clean up stack。至于往
stack上push的东东,和参数个数固定的函数调用应该没什么不同,至少在Windows平台
上是如此。

普通的定长

【在 l******d 的大作中提到】
: 比如printf()这种变长参数个数的函数,调用是stack里是需要push哪些东西的,跟普通的定长
: 参数函数调用有何不同呢?谢谢

t****t
发帖数: 6806
13
as xentar said, this tightly depends on specific ABI used. even on windows
32bit, cdecl, stdcall, fastcall, etc. are all different (of course, some of
them do not support variadic).
for example, on x86-64/linux, %al will be set to number of registers used in
variadic function call. although in all conventions, variadic calls must
let callee to find "..." parameters from the last fixed parameter.

【在 S**I 的大作中提到】
: 对参数个数可变的函数,调用结束后要由caller function来clean up stack。至于往
: stack上push的东东,和参数个数固定的函数调用应该没什么不同,至少在Windows平台
: 上是如此。
:
: 普通的定长

S**I
发帖数: 15689
14
多谢指正。win32上argument的pass,stdcall和cdecl是往stack上push,fastcall和
thiscall是先用寄存器,然后再往stack上push。但是只有cdecl是调用函数clean up
stack,所以参数个数可变的函数调用应该只能是cdecl。

of
in

【在 t****t 的大作中提到】
: as xentar said, this tightly depends on specific ABI used. even on windows
: 32bit, cdecl, stdcall, fastcall, etc. are all different (of course, some of
: them do not support variadic).
: for example, on x86-64/linux, %al will be set to number of registers used in
: variadic function call. although in all conventions, variadic calls must
: let callee to find "..." parameters from the last fixed parameter.

c******e
发帖数: 545
15
条件:
1. 主调函数清栈 (强)
2. 右到左压栈 (弱)
这样下来的话只有__cdecl符合条件。
如果从左向右压栈的话就要把参数描述表放在最后,不符合一般习惯。
1 (共1页)
进入Programming版参与讨论
相关主题
请问有没有用过IMSL库的大虾? (转载)有没有什么软件可以visualize代码间函数调用的关系?
[合集] C问题求助:如何强行从外部访问local static variable?类成员函数调用其它函数
怎么在FreeBSD内核里面实现随机流函数[合集] 请问是不是所有编程语言的函数调用,Matlab/C++/Java/Delph
问一个Matlab编程的问题,函数如何有可变输入参数? (转载)出个题考考大家:)
[合集] 几道面试问题C++ questions
[合集] call-by-ref降低了C++程序可读性heap&stack Linux vs. Windows
请教一个程序调用的内存问题 (转载)Python 中如何调用C的 exe 程序
请教c++里函数调用的问题请教c++ 类 内外的 同名函数问题
相关话题的讨论汇总
话题: 参数话题: 变长话题: 函数调用话题: stack话题: cdecl