【发布时间】:2019-07-31 01:25:01
【问题描述】:
被调用者是否可以通过使用内联 ASM (x86) 在不知道参数的类型或数量的情况下偏移堆栈基指针 (rbp) 来迭代(和计数)函数调用参数?
void foo(char *arg, ...);
我使用的是 Intel 编译器,但它的文档声明它支持 GCC 样式的内联汇编。所以基于 GCC 的例子就足够了。
#include <stdio.h>
#include <inttypes.h>
int main(int argc, char **argv){
uint64_t n;
__asm__ __volatile__(
"movq %%rbp, %0\n\t"
: "=r"(n)
);
printf("rbp = 0x%" PRIx64 "\n", n);
return 0;
}
【问题讨论】:
-
不,被调用者无法确定参数的数量。
-
你可以使用 ... 传递给一个函数并有任意数量的参数,如果这会导致任何帮助
-
在几乎所有的 C 实现中,没有。 C 的原始设计依赖于调用者和被调用者之间的契约,由程序员决定和执行。例如 printf 的约定是
%格式说明符的数量将匹配参数的数量。 -
有时甚至无法恢复参数,除非您知道它们的类型。
标签: c assembly x86-64 variadic-functions calling-convention