Как найти, если стек увеличивается вверх или вниз? - PullRequest
1 голос
/ 09 апреля 2010

как узнать, увеличивается ли стек вверх или вниз?

Ответы [ 4 ]

4 голосов
/ 09 апреля 2010

Это очень в зависимости от платформы и даже в зависимости от приложения.

Код, публикуемый Vino, работает только в целях, где параметры передаются в стек, а локальные переменные выделяются из стека в указанном порядке. Многие компиляторы назначают фиксированные адреса памяти параметрам или передают параметры в регистрах. Как правило, передача параметров в стек является одним из наименее эффективных способов ввода данных в функцию и из нее.

Посмотрите на разборку вашего скомпилированного приложения и посмотрите, какой код генерирует компилятор. Если ваша цель имеет собственные команды манипулирования стеком (такие как PUSH и POP), которые использует компилятор, тогда в техническом описании / справочном руководстве по ЦП будет указано, в каком направлении растет стек. Тем не менее, компилятор может решить реализовать свой собственный стек, и в этом случае вам придется заняться копанием.

Или прочитайте указатель стека, поместите что-нибудь в стек и снова прочитайте указатель стека. Сравните результаты первого и второго чтения, чтобы определить направление, в котором перемещается указатель.

Для дальнейшего использования: если вы включите некоторые подробности о вашей целевой архитектуре (встроенный ПК, Linux, Windows, GCC, VC, Watcom, бла-бла-бла), вы получите более значимые ответы.

2 голосов
/ 09 апреля 2010

Один из возможных способов ...

#include <stdio.h>

void call(int *a) 
{
    int b;

    if (&b > a) 
        printf("Stack grows up.\n");
    else 
        printf("Stack grows down.\n");
}

int main () 
{
    int a;
    call(&a);
    return 0;
}
0 голосов
/ 09 апреля 2010

Создать функцию со многими локальными переменными.
Отключить оптимизации. Либо распечатайте язык ассемблера .. Или при отладке отображать как смешанный исходный и ассемблерный языки. Обратите внимание на указатель стека (или регистр) перед выполнением функции. Выполните пошаговое выполнение функции и просмотрите указатель стека.

В целом, использование компилятором указателей стека - это очень незначительная проблема, если проблема постоянна и работает. Это одна проблема, которая редко занимает мой разум. Я склонен концентрироваться на более важных темах, таких как качество, правильность и надежность.

Я доверю компилятору правильно обрабатывать манипуляции со стеком. Я не доверяю рекурсивным функциям, особенно на встроенных или ограниченных платформах.

0 голосов
/ 09 апреля 2010

Метод грубой силы состоит в том, чтобы заполнить вашу память известным значением, скажем, 0xFF.Поместите некоторые предметы в стек.Сделай дамп памяти.Поместите еще несколько предметов в стек.Сделайте еще один дамп памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...