мы обращаемся к [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.
Это код для отладки без оптимизаций
Обсуждают сегодня