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 ответов

10 просмотров

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.

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

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

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Коллеги, я тут для личных нужд пошел ставить MQTT сервер, пощупал mosquitto, но ужаснулся отсутствию такой банальности, как HTTP API для посмотреть список топиков. А тут что,...
Maksim Lapshin
13
#include <stdio.h> #include <stdlib.h> #include <time.h> void mass_first_generate(int mass[5][7]) {     for (int N = 0; N < 5; N++) {         for (int A = 0; A < 7; A++) {   ...
Чувак
6
Всем привет! Решаю 99 OCaml Problems и столкнулся со следующей проблемой (прошу палками не забивать, я OCaml практически не трогал до этого момента): open OUnit2 let create_...
К|/|pи/\/\ 6е3yглbIи
2
https://www.linkedin.com/posts/ugama-benedicta-kelechi-codergirl-103041300_mobiledevelopment-fluttertraining-handsonlearning-activity-7263445699227254784-IdHB?utm_source=share...
CoderGirl
16
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
Точно, оно. У тебя там имена потоков выставляются?
Александр (Rouse_) Багель
11
возможно ли как-то передать в электрон или таури медиа поток с рендера 2д движка? двиг запускается как dll, а дальше надо как-то отправлять рендер кодировать не подходит, зр...
Kyle Nekto
7
Помогите пожалуйста. Делаю систему плагинов. Проблема сейчас в такая: плагины загружаются в основном потоке. FLibHandle := SafeLoadLibrary(FFileName) Но нужно еще выполнить фу...
Илья 🤣
10
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
Карта сайта