如何使用内联汇编访问参数 7+?

问题描述 投票:0回答:0

我想创建一个对其输入求和的可变参数函数。我已经设法编写了用于捕获参数 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 个参数。但是当我尝试将其打印为整数时,我得到了不正确的值。

我想我没有正确访问堆栈参数,但我不知道为什么!我该如何解决这个问题?

c x86-64 variadic-functions inline-assembly stack-frame
© www.soinside.com 2019 - 2024. All rights reserved.