У меня есть эта проблема, я рекурсивно вызываю функцию в C и C лексически области, поэтому я могу получить доступ только к текущему стеку стека. Я хочу извлечь аргументы и локальные переменные из предыдущего фрейма стека, который был создан при предыдущем вызове функции, в то время как im в текущем фрейме стекапредыдущие переменные стека
Я знаю, что значения из предыдущего рекурсивного вызова все еще находятся в стеке, но я не могу получить доступ к этим значениям, потому что они «похоронены» под активной рамкой стека?
Я хочу извлечь аргументы и локальные переменные из предыдущего стека и скопировать их в copy_of_buried_arg и copy_of_buried_loc;
Необходимо использовать встроенную сборку с использованием GAS для извлечения переменных, это то, что у меня есть до сих пор, и я пробовал весь день, я, похоже, не понимаю, я нарисовал стек на бумаге и сделал но ничего не работает, я также попытался удалить вызовы printf, чтобы стек был чище, но я не могу определить правильную арифметику. Вот код, до сих пор, моя функция останавливается на второй итерации
#include <stdio.h>
char glo = 97; // just for fun 97 is ascii lowercase 'a'
int copy_of_buried_arg;
char copy_of_buried_loc;
void rec(int arg) {
char loc;
loc = glo + arg * 2; // just for fun, some char arithmetic
printf("inside rec() arg=%d loc='%c'\n", arg, loc);
if (arg != 0) {
// after this assembly code runs, the copy_of_buried_arg and
// copy_of_buried_loc variables will have arg, loc values from
// the frame of the previous call to rec().
__asm__("\n\
movl 28(%esp), %eax #moving stack pointer to old ebp (pointing it to old ebp)\n\
addl $8, %eax #now eax points to the first argument for the old ebp \n\
movl (%eax), %ecx #copy the value inside eax to ecx\n\
movl %ecx, copy_of_buried_arg # copies the old argument\n\
\n\
");
printf("copy_of_buried_arg=%u copy_of_buried_loc='%c'\n",
copy_of_buried_arg, copy_of_buried_loc);
} else {
printf("there is no buried stack frame\n");// runs if argument = 0 so only the first time
}
if (arg < 10) {
rec(arg + 1);
}
}
int main (int argc, char **argv) {
rec(0);
return 0;
}
Не можете ли вы просто передать адрес местных жителей предыдущего вызова в следующую функцию? Мессинг с ассемблером не может привести к хорошим результатам. –
Как насчет запуска этого в вашем отладчике и получения чисел оттуда? –
@GregHewgill мы должны использовать сборку, чтобы выкопать переменные из предыдущего стека, это требование – David