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