Я пытаюсь полностью понять механизм наращивания стека при вызове функций, и я немного запутался Для лучшего понимания я написал следующую простую программу:
#include <stdio.h>
#include <stdint.h>
void callee(uint32_t* p)
{
uint32_t tmp = 9;
printf("callee - tmp is located at address location:%p and p is:%p \n", &tmp, p);
}
void caller()
{
uint32_t tmp1 = 12;
printf("caller - address of tmp1:%p \n", &tmp1);
calle(&tmp1);
}
int main(int argc, char** argv)
{
caller();
return 0;
}
И, используя онлайн-конвертер , я получил следующий вывод сборки (я оставил только код функции callee
):
.LC0:
.string "callee - tmp is located at address location:%p and p is:%p \n"
calle:
push rbp
mov rbp, rsp
sub rsp, 32 // command 1
mov QWORD PTR [rbp-24], rdi
mov DWORD PTR [rbp-4], 9 // command 2
mov rdx, QWORD PTR [rbp-24]
lea rax, [rbp-4]
mov rsi, rax
mov edi, OFFSET FLAT:.LC0
mov eax, 0
call printf
nop
leave
ret
Как я понимаю, принимая во внимание команды 1 и 2 (отмеченные выше), стек действительно уменьшается к младшим адресам и (примерному) выводу скомпилированного кода, когда я компилирую его с использованием команда gcc myProg.c -o prog
выглядит следующим образом:
абонент - адрес tmp1: 0x7ffe423e8ed4
callee - tmp находится по адресу: 0x7ffe423e8eb4 и p: 0x7ffe423e8ed4
Где видно, что локальная переменная, выделенная в функции callee
, расположена в более низком адресе памяти, чем локальная переменная в функции caller
. Так что хорошо.
И все же , когда я компилирую программу с опцией -O2
(т.е.: gcc -O2 myProg.c -o prog
), (пример) вывод скомпилированного кода выглядит примерно так:
абонент - адрес tmp1: 0x7fff0d5bfa90
callee - tmp находится по адресу: 0x7fff0d5bfa94 и p: 0x7fff0d5bfa90
Что на этот раз показывает, что локальная переменная, выделенная в кадре стека callee
, расположена в более высоком адресе памяти, чем локальная переменная в функции caller
.
Так что мой вопрос - опция оптимизации -O2
оптимизирует "до" ситуации, когда механизм роста стека действительно изменяется или я что-то здесь упускаю ...?
gcc
версия: 7.3
архитектура: x86_64
ОС: Ubuntu 18.04.
Ценю ваши разъяснения.
Guy.