Итак, я читаю CS: APP (книга основана на x86-64) и натолкнулся на упражнение о массивах переменного размера, которое подразумевает стеки переменного размера.Дается следующий код и выходные данные сборки (формат не позволяет мне копировать код): и структура фрейма стека с этим кодом
Несмотря на то, что я читал о выравнивании данных, различных арифметических операциях и т. Д., Эта сборка вызывает много вопросов - а именно:
- Я получаю использование% rbp, чтобы указать набазовый адрес для возврата.Но почему в мире выделяют 16 байтов для переменной
i
, которая требует только 8 байтов?Я не понимаю, почему здесь необходимо выравнивание данных, если это является причиной - В строке 5 сборки это
leaq 22(,%rdi,8), %rax
- почему 22?Я получаю эту строку 6 округляет ее до ближайшего 16, но как это относится к 22? - Точно так же, в строках 8-10, почему
leaq 7(%rsp), %rax
? - Я не понимаю, почему тамможет потребоваться заполнение p и s2 на рисунке - это заполнение показано как e2 .