Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Очистка стека 
:(
    Опции темы
rsaReliableS
Дата 22.8.2010, 20:14 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 22.8.2010

Репутация: нет
Всего: нет



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

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

#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#
PM   Вверх
Abyx
Дата 22.8.2010, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 1
Всего: 10



rsaReliableS, вы бредите.
PM MAIL   Вверх
Logree
Дата 23.8.2010, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 22.11.2006
Где: Самара

Репутация: нет
Всего: 2



ps инструкции pop и push работают со стеком расположенным по адресу ss:esp.


--------------------
Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд.
PM MAIL ICQ   Вверх
rsaReliableS
Дата 23.8.2010, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 22.8.2010

Репутация: нет
Всего: нет



Logree, спасибо.

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

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

(спасибо redsh)

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


Это сообщение отредактировал(а) rsaReliableS - 23.8.2010, 21:04
PM   Вверх
Logree
Дата 24.8.2010, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 22.11.2006
Где: Самара

Репутация: нет
Всего: 2



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


--------------------
Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд.
PM MAIL ICQ   Вверх
rsaReliableS
Дата 24.8.2010, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 22.8.2010

Репутация: нет
Всего: нет



Logree, разумеется smile я просто показал способ решения моей проблемы
PM   Вверх
iff
Дата 28.8.2010, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 4
Всего: 16



Код

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

или
Код

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



--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0427 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.