Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2009, 03:22   #1
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию Баг с модификацией стека

Код:
proc lv_item_insert
		mov  ebx,0
	@@:
		push esp
		pushad
		mov  eax,10h
		add  [cAddr],eax
		;invoke _itoa,[cAddr],ADR,16
		popad
		pop  esp
		mov  [lvItem.mask],LVIF_TEXT + LVIF_PARAM
		lea  eax,[ADR]
		mov  [lvItem.pszText],eax
		mov  [lvItem.iSubItem],0
		mov  [lvItem.iItem],ebx
		mov  [lvItem.lParam],ebx
		lea  eax,[lvItem]
	invoke	SendMessage,[lvH],LVM_INSERTITEM,0,eax
		mov  [lvItem.mask],LVIF_TEXT
		inc  [lvItem.iSubItem]
		lea  eax,[DAT]
		mov  [lvItem.pszText],eax
		lea  eax,[lvItem]
	invoke	SendMessage,[lvH],LVM_SETITEM,0,eax
		inc  ebx
		cmp  ebx,20
		jb   @b
		ret
endp
Стоит поставить гденить внутри этого цикла лишний push как программа падает...
Код:
                push esp
		pushad
		;Safe Code

                ;Safe Code Ends
		popad
		pop  esp
Чисто теоретически этот блок защищен от модификаций стека. Т.е. напиши я внутри него push - стек останется неизменным. Ну вернее данные останутся но следюущие данные их перезапишут. Но не смотря на это если туда поставить команду скажем push 100h - программа опять же упадет.

Откуда могут расти ноги у этого бага?
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 09.03.2009, 15:35   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

довольно-таки непонятный код....
во-первых, достаточно одной pushad вместо push esp, pushad
Код:
	lea  eax,[lvItem]
	invoke	SendMessage,[lvH],LVM_INSERTITEM,0,eax
		mov  [lvItem.mask],LVIF_TEXT
		inc  [lvItem.iSubItem]
		lea  eax,[DAT]
		mov  [lvItem.pszText],eax
		lea  eax,[lvItem]
	invoke	SendMessage,[lvH],LVM_SETITEM,0,eax
		inc  ebx ;<--- в EBX ерунда!
		cmp  ebx,20
после вызова API функций большинство регистров изменяется.
А что вообще нужно было?

Последний раз редактировалось rpy3uH; 09.03.2009 в 15:40.
rpy3uH вне форума Ответить с цитированием
Старый 09.03.2009, 16:28   #3
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
Стоит поставить гденить внутри этого цикла лишний push как программа падает...

Код:

push esp
pushad
;Safe Code

;Safe Code Ends
popad
pop esp

Чисто теоретически этот блок защищен от модификаций стека. Т.е. напиши я внутри него push - стек останется неизменным.
Извините, не понимаю... Что значит блок защищен от модификаций стека?
Вызвали push, соответственно esp уменьшился на 4, т.е. вершина стека уже другая? После этого popad естественно всякую ересь восстановит, а не то, что вы в стек pushad_om записали. Т.е. модифицировали указатель стека, будьте любезны вернуть его на место. Или я чего то недопонял?
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 09.03.2009, 16:39   #4
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Это функция записи айтемов в ListView. Нужно положить в DAT и ADR нужные значения и записать их в pszText. Но по какой то причине стоит вызвать функцию itoa или sprintf как программа падает. pushad и push ESP это только для надежности. Но по какой то причине стек всеравно модифицируется. Может тут что с чем то другим проблема?
Да кстати, вот ListView работает только если его создать вручную - через CreateWindowEx. Тот который из ресурсов просто напросто не принимает столбцы.

Ulex, да вы все правильно поняли. Восстанавливается конечно только указатель на стек. Я неправильно выразился.
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 09.03.2009, 17:06   #5
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

А можно всю программу целиком увидеть. Просто есть подозрение, что стек здесь не при чём. Вот к примеру, судя по названию [ADR] - эта переменная должна содержать адрес какой то текстовой строки, однако вот это дальше - lea eax,[ADR], несколько настораживает.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 09.03.2009, 17:08   #6
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от Ivan_32 Посмотреть сообщение
Но по какой то причине стек всеравно модифицируется. Может тут что с чем то другим проблема?
стек модифицируется API функциями. также эти API функции модифицируют регистры общего назначения. В данном примере в качестве счётчика используется регистр ebx, его надо сохранять перед каждым вызовом API функции и после вызова восстанавливать. Например, так:
Код:
push ebx
invoke ...
pop ebx

Последний раз редактировалось rpy3uH; 09.03.2009 в 17:15.
rpy3uH вне форума Ответить с цитированием
Старый 09.03.2009, 17:36   #7
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Вот это работает без каких либо проблем:
Код:
proc lv_item_insert
		mov  ebx,0
	@@:
		push esp
		pushad
		mov  eax,10h
		add  [cAddr],eax
		popad
		pop  esp
		mov  [lvItem.mask],LVIF_TEXT ;+ LVIF_PARAM
		lea  eax,[ADR]
		mov  [lvItem.pszText],eax
		mov  [lvItem.iSubItem],0
		mov  [lvItem.iItem],ebx
		;mov  [lvItem.lParam],ebx
		lea  eax,[lvItem]
		push ebx
	invoke	SendMessage,[lvH],LVM_INSERTITEM,0,eax
		pop ebx
		mov  [lvItem.mask],LVIF_TEXT
		inc  [lvItem.iSubItem]
		lea  eax,[DAT]
		mov  [lvItem.pszText],eax
		lea  eax,[lvItem]
		push ebx
	invoke	SendMessage,[lvH],LVM_SETITEM,0,eax
		pop ebx
		inc  ebx
		cmp  ebx,20
		jb   @b
		ret
endp
А вот это вызывает краш:
Код:
proc lv_item_insert
		mov  ebx,0
	@@:
		push esp
		pushad
		mov  eax,10h
		add  [cAddr],eax
		invoke _itoa,[cAddr],ADR,16
		popad
		pop  esp
		mov  [lvItem.mask],LVIF_TEXT ;+ LVIF_PARAM
		lea  eax,[ADR]
		mov  [lvItem.pszText],eax
		mov  [lvItem.iSubItem],0
		mov  [lvItem.iItem],ebx
		;mov  [lvItem.lParam],ebx
		lea  eax,[lvItem]
		push ebx
	invoke	SendMessage,[lvH],LVM_INSERTITEM,0,eax
		pop ebx
		mov  [lvItem.mask],LVIF_TEXT
		inc  [lvItem.iSubItem]
		lea  eax,[DAT]
		mov  [lvItem.pszText],eax
		lea  eax,[lvItem]
		push ebx
	invoke	SendMessage,[lvH],LVM_SETITEM,0,eax
		pop ebx
		inc  ebx
		cmp  ebx,20
		jb   @b
		ret
endp
При чем функция _itoa работает где угодно вполне корректно, только в этой процедуре вызывает краш. Это такие особенности записи значений в ListView что ли?

UPDATE:
Нашел решение проблемы:
invoke sprintf,ADR,xtoa,1000
pop eax
pop eax
pop eax
"Тяжело в учении, легко в бою" - А.В. Суворов

Последний раз редактировалось Ivan_32; 09.03.2009 в 17:48.
Ivan_32 вне форума Ответить с цитированием
Старый 09.03.2009, 18:55   #8
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

функция sprintf является функцией из библиотеки С++, и вызывается по соглашению cdecl. При использовании формата cdecl стек должен очищать не вызываемый, а вызывающий.
rpy3uH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
БАГ при загрузке!!! 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