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吧。但最近准备面试题时碰到这题, : 不知道我是不是漏了什么没考虑。
|
|
|
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符合条件。
如果从左向右压栈的话就要把参数描述表放在最后,不符合一般习惯。 |