Как я могу получить доступ к аргументам 7+, используя встроенную сборку?

Я хотел бы создать вариативную функцию, которая суммирует свои входные данные. Мне удалось написать встроенную сборку для захвата аргументов 2–6, но я изо всех сил пытаюсь получить другие аргументы из кадра стека.

Я пытаюсь решить упражнение по кодированию, которое научит вас понимать фрейм стека и способ доступа к аргументам в ассемблере, поэтому я не используюva.

Я следую соглашению о вызовах Linux x86-64, используя информацию с этого сайта. Это привело к моей нынешней попытке:

      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 к этому значению должно привести меня к седьмому аргументу, хранящемуся во фрейме стека. Но я получаю неправильное значение, когда пытаюсь напечатать его как целое число.

Я предполагаю, что неправильно обращаюсь к аргументам стека, но не знаю, почему! Как я могу это исправить?

0 ответов

Другие вопросы по тегам