Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Очистка стека


Автор: rsaReliableS 22.8.2010, 20:14
Сабж вопрос:
Перед выходом из программмы требуется обнулить стек.

Когда это требовалось в с++, хватало одного цикла:
Код

#include <iostream>
#include <stack>
using namespace std;
int main()
{
    stack<int> stk;
    // ....
    while(!stk.empty())
    {
        stk.pop();
    }
    // ....
    return 0;
}


Логично, что pop требуется юзать и на асме. Но вопрос: до каких пор? Если какой-то флаг, говорящий: пуст стек или нет?
Чтобы в итоге иметь схожую структуру:
Код

#include <iostream>
using namespace std;
int main()
{
    // ....
    /* проверяем флаг */
    while(/* результат проверки флага */)
        __asm
        {
            pop eax;
            ; /* проверяем флаг */
        }
    }
    // ....
    return 0;
}


Или возможно есть другой способ очистить стек? Что-то типо .clear() в C#

Автор: Abyx 22.8.2010, 20:18
rsaReliableS, вы бредите.

Автор: Logree 23.8.2010, 16:23
ps инструкции pop и push работают со стеком расположенным по адресу ss:esp.

Автор: rsaReliableS 23.8.2010, 21:03
http://forum.vingrad.ru/users/Logree, спасибо.

В общем если исходить из асма, то безболезненный выход из программы я решил сделать так:
Код

#include <iostream>
using namespace std;
int main()
{
    __asm
    {
        mov eax,esp; сохранили первоначальное состояние стека
    }
    // ....
    __asm
    {
        push 8h;
    }
    // ....
    __asm
    {
        mov esp,eax; вернули
    }
    return 0;
}

(спасибо redsh)

Либо, если опять же говорить об ассемблерных вставках в с++, то безболезненный выход нам дает exit(0); в любом месте программы, если конечно нет причин его не использовать.

Автор: Logree 24.8.2010, 14:36
такой подход, скорее всего, работать не будет, сохраняй esp в какую нибудь переменную, eax может затереться.

Автор: rsaReliableS 24.8.2010, 20:43
http://forum.vingrad.ru/users/Logree, разумеется smile я просто показал способ решения моей проблемы

Автор: iff 28.8.2010, 21:00
Код

add sp, число_ранее_записанных_данных_в_стек,_в_байтах

или
Код

mov sp, смещение_вершины_стека

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)