|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
09.03.2009, 03:22 | #1 |
somewhere else
Участник клуба
Регистрация: 17.07.2008
Сообщений: 1,409
|
Баг с модификацией стека
Код:
Код:
Откуда могут расти ноги у этого бага?
"Тяжело в учении, легко в бою" - А.В. Суворов
|
09.03.2009, 15:35 | #2 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
довольно-таки непонятный код....
во-первых, достаточно одной pushad вместо push esp, pushad Код:
А что вообще нужно было? Последний раз редактировалось rpy3uH; 09.03.2009 в 15:40. |
09.03.2009, 16:28 | #3 | |
Непрофессионал
Участник клуба
Регистрация: 01.01.2008
Сообщений: 1,405
|
Цитата:
Вызвали push, соответственно esp уменьшился на 4, т.е. вершина стека уже другая? После этого popad естественно всякую ересь восстановит, а не то, что вы в стек pushad_om записали. Т.е. модифицировали указатель стека, будьте любезны вернуть его на место. Или я чего то недопонял?
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------ Страничка с моими программками http://ulex-masm.ru |
|
09.03.2009, 16:39 | #4 |
somewhere else
Участник клуба
Регистрация: 17.07.2008
Сообщений: 1,409
|
Это функция записи айтемов в ListView. Нужно положить в DAT и ADR нужные значения и записать их в pszText. Но по какой то причине стоит вызвать функцию itoa или sprintf как программа падает. pushad и push ESP это только для надежности. Но по какой то причине стек всеравно модифицируется. Может тут что с чем то другим проблема?
Да кстати, вот ListView работает только если его создать вручную - через CreateWindowEx. Тот который из ресурсов просто напросто не принимает столбцы. Ulex, да вы все правильно поняли. Восстанавливается конечно только указатель на стек. Я неправильно выразился.
"Тяжело в учении, легко в бою" - А.В. Суворов
|
09.03.2009, 17:06 | #5 |
Непрофессионал
Участник клуба
Регистрация: 01.01.2008
Сообщений: 1,405
|
А можно всю программу целиком увидеть. Просто есть подозрение, что стек здесь не при чём. Вот к примеру, судя по названию [ADR] - эта переменная должна содержать адрес какой то текстовой строки, однако вот это дальше - lea eax,[ADR], несколько настораживает.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------ Страничка с моими программками http://ulex-masm.ru |
09.03.2009, 17:08 | #6 | |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
Цитата:
Код:
Последний раз редактировалось rpy3uH; 09.03.2009 в 17:15. |
|
09.03.2009, 17:36 | #7 |
somewhere else
Участник клуба
Регистрация: 17.07.2008
Сообщений: 1,409
|
Вот это работает без каких либо проблем:
Код:
Код:
UPDATE: Нашел решение проблемы: invoke sprintf,ADR,xtoa,1000 pop eax pop eax pop eax
"Тяжело в учении, легко в бою" - А.В. Суворов
Последний раз редактировалось Ivan_32; 09.03.2009 в 17:48. |
09.03.2009, 18:55 | #8 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
функция sprintf является функцией из библиотеки С++, и вызывается по соглашению cdecl. При использовании формата cdecl стек должен очищать не вызываемый, а вызывающий.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
БАГ при загрузке!!! | Tatyana_777 | Операционные системы общие вопросы | 8 | 11.03.2009 09:51 |
Сегмент стека | Santilos | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 2 | 24.12.2008 18:47 |
Первый баг (фото) | mutabor | Свободное общение | 1 | 06.05.2008 11:51 |
Баг в BDS2006 | posdnyaa | Софт | 1 | 19.12.2007 12:31 |