Описание тега stack-frame

Используйте stackframe для вопросов, связанных с отладкой незавершенных вызовов функций.
5 ответов

Что такое регистры ESP и EBP?

Я обнаружил, что регистр ESP - это текущий указатель стека, а EBP - базовый указатель для текущего кадра стека. Однако я не понимаю этих определений (я только начинаю изучать, как писать код на ассемблере). Я понимаю, что ESP указывает на сам стек, …
12 фев '14 в 04:06
1 ответ

Сборка RISC-V - компоновка стека - вызов функции

В настоящее время я работаю с реализацией процессора RISC-V. Мне нужно запустить частично собранный код сборки. (Наконец, будет динамическое внедрение кода.) Для этого мне нужно понять основы вызовов функций в сборке RISC-V. Я нашел эту тему очень п…
1 ответ

Какие "лишние" 32 байта в стеке Windows?

Я изучаю сборку в Windows и пытаюсь выяснить, какие значения в стеке. В документации Visual C++ сказано, что значения выше RSP: Выделенное пространство Сохраненная RBP Обратный адрес Регистры дома (RCX, RDX, R8, R9) Параметры функции Проблема в том,…
26 мар '20 в 14:21
1 ответ

Как проверить, присвоено ли возвращаемое значение функции чему-либо в Python

У меня есть функция с возвращаемым значением. Я бы хотел, чтобы функция вела себя по-другому, когда возвращаемое значение функции чему-то присваивается. Так что примерно так: def func(): if return_value_assigned(): print("yes") else: print("no") ret…
02 сен '19 в 03:39
0 ответов

Как ключевое слово yield запоминает, какая инструкция будет выполняться следующей, и состояние кадра стека в тот самый момент, когда управление было возвращено?

Я узнал, что когда управление потоком возвращается из функции, которая в настоящее время выполняется, его вызывающему, его стековый фрейм будет уничтожен в сборке, но похоже, что это не верно для ключевого слова C# yield.
07 окт '19 в 19:32
1 ответ

Почему у меня возникает ошибка сегментации в рекурсивной функции сборки?

Привет, я пишу рекурсивный код Фибоначчи в сборке с соглашением о вызовах amd64 abi, но всегда получаю ошибку сегментации:/ Я компилирую его с помощью: nasm -f elf64 -o fibo.o fibonacci.asm ld -o fibo fibo.o ./fibo У меня нет ошибок компиляции, но е…
13 ноя '19 в 00:17
0 ответов

Почему локальные переменные в методе заранее собираются мусором?

Это многопоточный тестовый код, каждый раз, когда создается newSingleThreadExecutor, а два других потока постоянно запускают gc. В HotSpot java8 (1.8.0_221) будет ошибка, что пул потоков был закрыт. public class ThreadPoolTest { public static void m…
0 ответов

Почему для вершины стека установлено текущее значение "EP минус один", а не "EP" после возврата из подпрограммы?

Я читаю книгу Роберта В. Себесты "Концепции языков программирования", глава 10. Подпрограмма. И я не понимаю, почему вершина стека установлена ​​на текущее значение EP минус один после возврата из подпрограммы. Вот предложение, которое я не понимаю.…
1 ответ

Является ли стековый кадр функции, вызываемой несколько раз, каждый раз различным?

void foo() { int i; printf("%d",i++); } int main() { int j; for(j=0;j<10;j++) { foo(); } } Результатом кода является серия из 10 случайных, но непрерывных чисел. Я хотел знать, как это возможно, если я инициализируюсь каждый раз и мой класс хране…
24 ноя '19 в 10:56
2 ответа

Переместить текущий кадр стека в C

Мне было интересно, есть ли удобный способ скопировать текущий кадр стека, переместить его в другое место, а затем "вернуться" из функции из нового места? Я играл с setjmp а также longjmpпри выделении больших массивов в стеке, чтобы отодвинуть указа…
16 дек '19 в 11:04
1 ответ

Почему мой базовый вариант (ошибочно) запускается немедленно?

Я пытаюсь реализовать алгоритм сортировки слиянием на языке C. В рекурсивной функции разделения массива мой базовый случай происходит бесконечно, несмотря на оператор return, а функция слияния никогда не вызывается. Вот мой код: #include <stdio.h…
0 ответов

Получить значение переменной из стека

Я пытаюсь больше понять, как работает стек внутри. Я хорошо понимаю, что такое стек, что такое куча и как они сравниваются. На данный момент меня не интересует, как используется стек при вызове другой функции и последующем возврате из этой функции. …
20 фев '20 в 01:47
0 ответов

Почему базовый указатель указывает на вершину стека?

В книге "Программирование с нуля" я вижу фрейм стека при вызове функции примерно так parameter 2 <- 12(%ebp) parameter 1 <- 8(%ebp) return address <- 4(%ebp) ebp <- (%ebp) local var 1 <- -4(%ebp) local var 2 <- -8(%ebp) and (%esp) …
09 мар '20 в 05:16
0 ответов

Помещается ли что-нибудь в стек после вектора elf aux процесса в формате elf и выполняется с соглашением о вызовах SYSV

Я пишу свою собственную библиотеку libc, чтобы узнать о дизайне стандартной библиотеки POSIX C, основах компоновки, формате файла elf и различных других лишних вещах, и я написал простой crt1, который помещает argc, argv и envp в registers устанавли…
11 апр '20 в 06:57
0 ответов

При измерении высоты стека времени выполнения вы считаете первый кадр стека как "0" или "1"?

Считаете ли вы это как глубину дерева, где корневой узел находится на уровне 0?
15 май '20 в 07:46
3 ответа

Есть ли разница между перемещением регистров до создания кадра стека или после?

Предположим, у меня есть функция с именем func: PROC func: ;Bla bla ret ENDP func Теперь предположим, что я использую регистр ax а также bx например, чтобы сохранить их начальное значение, я помещаю их в стек внутри функции. Теперь к вопросу: есть л…
01 дек '19 в 23:34
0 ответов

Вопрос о коде сборки и кадре стека и регистре

На изображениях показан вопрос и дан ответ об ассемблерном коде, в котором предлагается оценить, как регистры и указатель кадра стека будут изменяться в точке останова. Я просто не могу понять, почему изменяется% rsp, поскольку до точки останова, п…
01 янв '20 в 12:36
1 ответ

Понимание фреймов стека и rbp и rsp с gdb

Я новичок в ассемблерном языке, и я немного запутался в некоторых вещах. В качестве задания мне дают программу на C и меня просят поставить точки останова в двух точках и подсчитать кадры стека и их расположение. Это код: int swap_n_add(int *xp, int…
12 мар '20 в 06:21
0 ответов

Почему адрес в стеке на 8 байтов дальше?

Вот эта инструкция mov: 0040064e 89 7d dc MOV dword ptr [RBP + local_2c],EDI EDI сохраняет argc из основной функции. Я хотел проверить его значение, посмотрев на rbp - 0x2c: (gdb) x/x $rbp-0x2C 0x7ffffffee1c4: 0x00000000 Как видите, там ничего нет. …
1 ответ

Фрейм стека и возврат

Итак, я сейчас читаю "Практический обратный инжиниринг" - x86, x64, ARM, ядро ​​Windows, инструменты реверсирования и обфускации. Книга включает следующий пример, объясняющий фрейм стека. addme (x, y) 01: 004113A0 55 push ebp 02: 004113A1 8B EC mov …
07 июл '20 в 00:45