Я пытаюсь понять, как создается сборка для c. Я написал образец программы и разобрал ее для того же самого.Инструкции по сборке для функции с указателем как локальной переменной
int main()
{
int a = 100;
}
Ассамблея генерироваться:
pushq %rbp #
movq %rsp, %rbp #,
subq $48, %rsp #,
call __main #
movl $100, -4(%rbp) #, a
leave
ret
Это довольно прямо вперед для меня. Но я не понимаю сборку, когда включаю в нее указатель.
C Программа:
int main()
{
int a = 100;
int *p = &a;
}
Ассамблея генерироваться:
pushq %rbp #
movq %rsp, %rbp #,
subq $48, %rsp #,
call __main #
movl $100, -12(%rbp) #, a
leaq -12(%rbp), %rax #, tmp59
movq %rax, -8(%rbp) # tmp59, p
leave
ret
Я не понимаю, почему местная переменная а теперь толкнул другого со смещением в стеке по сравнению с тха ранее надреза, который не делает есть указатель в нем.
Вопрос №2: Если у меня есть 4 локальных переменных, то мой стек кадров составляет $ 48,% rsp, но если я конвертирую одну из локальных переменных в указатель, это подкласс $ 64. почему это так.
код C:
int main()
{
int a = 100;
int *p = &a;
int b = 10;
int c = 20;
}
Монтаж:
pushq %rbp #
movq %rsp, %rbp #,
subq $64, %rsp #,
call __main #
movl $100, -20(%rbp) #, a
leaq -20(%rbp), %rax #, tmp59
movq %rax, -8(%rbp) # tmp59, p
movl $10, -12(%rbp) #, b
movl $20, -16(%rbp) #, c
leave
ret
Кроме того, было бы полезно, если бы вы, ребята, можете объяснить, почему стек кадр 2 * 16 байт выровненные (32 байта) для основная функция без локальных переменных. Угадайте, что это должно быть для некоторых упражнений по хранению книг, но какая именно причина?
Спасибо,
Компилятор может помещать переменные в любом месте в стек, который он хочет. – Mysticial
Спасибо Мистический. Тем не менее у меня есть еще один вопрос. Я опубликовал вопрос в той же теме. Тем не менее он слишком велик, чтобы добавить в качестве комментария. – trialyogi
@trialyogi? у вас есть две локальные переменные: 'a' и' p'. 100 - это константа времени компиляции, а адрес 'a' используется в присваивании ... но с правой стороны (не слева). Вы можете видеть в сборке, что компилятор выделил 8 байтов с наивысшим адресом в фрейме стека для 'p', а затем 4 байта ниже, чем для' a'. – rliu