169 похожих чатов

В общем помогите, мужики, затуп какой то Ниже, в отмеченной строчке,

мы обращаемся к [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

9 ответов

14 просмотров

push rbp уже сместил указатель на вершину стека. Надеюсь, правильно понял вопрос.

это x64 по всему fastcall, значит место зарезервировано в вызывающей функции. гугли что-то вроде shadow space в контексте fastcall

Илья-Грошев Автор вопроса
randomize usr
это x64 по всему fastcall, значит место зарезервир...

звучит как то, что мне нужно) благодарю

[rbp-4] - локальная переменная, чтоб ее использовать совсем не обязательно двигать фрейм, другое дело зачем переменная вообще используется - эмулирует какое то приведение типов на ЯВУ?

Илья-Грошев Автор вопроса

разве если бы это была локальная переменная То перед этой третьей строкой не было бы написано что-то вроде: sub RSP, 4 Чтобы выделить на стеке место под эту самую переменную Или я не очень понимаю, что значит "чтобы ее использовать совсем не обязательно двигать фрейм". почему не обязательно?

Илья Грошев
разве если бы это была локальная переменная То пер...

И всё-таки, мне не нравятся ответы, которые здесь дали. Дам чуть более развёрнутый. В соответствии с SystemV ABI, у нас есть 128 байтная область, после которой начинается красная зона. В данном случае у нас идёт листовой вызов, и мы уверены, что в этот промежуток памяти никто не попадёт. Поэтому мы можем использовать данную область памяти без опаски. Это частный случай. Столяров в общем случае прав, он предлагает исходить из консервативного предположения. Если бы он начал расписывать отдельные частные случаи, у него была бы книга не по программированию для начинающих, а сборник переводов документации.

Илья-Грошев Автор вопроса
Alex
screenshot И всё-таки, мне не нравятся ответы, которые здесь ...

Так столяров и пишет про частный случай: конвенции вызова в линуксе (или юниксе, или что у него там?). Это точно такая же часть конвенции, как сохранение esi/edi/ebx/ebp.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта