мы обращаемся к [rpb-4], но при этом в этой "функции" мы не сдвигаем перед этим RSP, типо sub ESP, 4.
Не получается такого, что мы за вершину стека обращаемся?
Это кстати ассемблерный код получившийся в результате компиляции простейшей программы на плюсах, надеюсь, у вас это не запрещено
func(int):
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], edi # вот здесь
mov eax, DWORD PTR [rbp-4]
add eax, 10
pop rbp
ret
main:
push rbp
mov rbp, rsp
sub rsp, 16
mov edi, 5
call func(int)
mov DWORD PTR [rbp-4], eax
mov eax, 0
leave
ret
push rbp уже сместил указатель на вершину стека. Надеюсь, правильно понял вопрос.
это x64 по всему fastcall, значит место зарезервировано в вызывающей функции. гугли что-то вроде shadow space в контексте fastcall
звучит как то, что мне нужно) благодарю
[rbp-4] - локальная переменная, чтоб ее использовать совсем не обязательно двигать фрейм, другое дело зачем переменная вообще используется - эмулирует какое то приведение типов на ЯВУ?
разве если бы это была локальная переменная То перед этой третьей строкой не было бы написано что-то вроде: sub RSP, 4 Чтобы выделить на стеке место под эту самую переменную Или я не очень понимаю, что значит "чтобы ее использовать совсем не обязательно двигать фрейм". почему не обязательно?
И всё-таки, мне не нравятся ответы, которые здесь дали. Дам чуть более развёрнутый. В соответствии с SystemV ABI, у нас есть 128 байтная область, после которой начинается красная зона. В данном случае у нас идёт листовой вызов, и мы уверены, что в этот промежуток памяти никто не попадёт. Поэтому мы можем использовать данную область памяти без опаски. Это частный случай. Столяров в общем случае прав, он предлагает исходить из консервативного предположения. Если бы он начал расписывать отдельные частные случаи, у него была бы книга не по программированию для начинающих, а сборник переводов документации.
Большое спасибо за время уделенное
Так столяров и пишет про частный случай: конвенции вызова в линуксе (или юниксе, или что у него там?). Это точно такая же часть конвенции, как сохранение esi/edi/ebx/ebp.
Это код для отладки без оптимизаций
Обсуждают сегодня