我想创建一个对其输入求和的可变参数函数。我已经设法编写了用于捕获参数 2-6 的内联汇编,但我正在努力从堆栈框架中检索其他参数。
我正在尝试解决一个编码练习,该练习教您了解堆栈框架以及如何在汇编中访问参数,这就是为什么我不使用
va
.
我一直在遵循 Linux x86-64 调用约定以及来自此 site 的信息。这导致了我目前的尝试:
int n_sum(int n, ...)
{
int sum = 0;
if (n > 0)
__asm__("add %%rsi, %0": "+m"(sum));
if (n > 1)
__asm__("add %%rdx, %0": "+m"(sum));
if (n > 2)
__asm__("add %%rcx, %0": "+m"(sum));
if (n > 3)
__asm__("add %%r8, %0": "+m"(sum));
if (n > 4)
__asm__("add %%r9, %0": "+m"(sum));
printf("%d\n", sum);
if (n > 5)
{
void *extra_args;
__asm__("mov %%rbp, %0" : "=r"(extra_args));
printf("%p\n", extra_args);
extra_args += 16;
printf("%d\n", extra_args);
}
return sum;
}
int main()
{
n_sum(10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
return 0;
}
我的期望是命令:
__asm__("mov %%rbp, %0" : "=r"(extra_args));
已将 %rbp
的值移动到我的 extra_args
指针。因此,将 16 添加到该值应该将我移动到存储在堆栈帧中的第 7 个参数。但是当我尝试将其打印为整数时,我得到了不正确的值。
我想我没有正确访问堆栈参数,但我不知道为什么!我该如何解决这个问题?