Есть процедура таймера. Есть переменная PreferActive dd 0, расположена она в секции .data При попытке вписать что-либо в PreferActive в теле TimerProc, последняя просто прекращает свой ход. Т.е. операции, стоящие после mov PreferActive,1 просто не выполняются. Если же перенести PreferActive в секцию .data? то процедура нормально доходит до своего ret. Почему такой эффект?
Вот вся процедура, без сокращений. Процедура расположена в .asm, секции .data и .data? - в .inc. Из других мест .asm переменная ведёт себя нормально Код (Text): TimerProc proc hWin:DWORD, uMsg:DWORD, idEvent:DWORD, dwTime:DWORD LOCAL CurrID :DWORD LOCAL Buff[256] :BYTE LOCAL Buff_1[128] :BYTE Call GetIntefaceCount ;заполнение листбокса ;получаем из реестра имя prefer интерфейса invoke RegGetStringValue,HKEY_LOCAL_MACHINE,ADDR KeyName,ADDR ValuePrefer,ADDR Buff invoke SendMessage,hListBox,LB_FINDSTRING,0,ADDR Buff .if eax == LB_ERR ;если его нет, выделяем первый .if PreferActive==1 ;если prefer был,но исчез mov PreferActive,0 .endif mov CurrID,0 .else mov CurrID,eax mov PreferActive,1 .endif ;до этого мессаджбокса не доходит..... invoke MessageBox,NULL,ADDR Fucking_Data,ADDR Fucking_Data,MB_OK ;и все последующие инструкции не выполняются тоже invoke SendMessage,hListBox,LB_SETCURSEL,CurrID,0 push CurrID Call FillListView invoke IsIconic,hWnd test eax,eax jnz @F Call DrawTraff Call GetNetTime invoke SecondsToTime,ADDR Buff,eax invoke lstrcpy,ADDR Buff_1,ADDR szNetTime invoke lstrcat,ADDR Buff_1,ADDR Buff invoke lstrcat,ADDR Buff_1,SADD(" сек") invoke SetDlgItemText,hWnd,IDC_STC6,ADDR Buff_1 @@: ret TimerProc endp Если перенести PreferActive в .data? или закомментировать строки, где она встречается, то процедура работает до конца
Да, и ещё: PreferActive больше нигде не используется, только в этой процедуре. Я просто хотел немного переделать код, и начал с этой переменной, в других частях её пока что нет.
bogrus Попробовал в твоем коде - работает и в .data и в .data? Правда у тебя один файл, без .inc, может это влияет как-то?
Блин, ещё одна такая же фигня: сделал специально в .data Var dd 0 в файле inc, и по нажатию кнопки, обработка которой в .asm, записал единственную инструкцию: mov Var,1. Результат - программа вылетела Перенёс Var dd 0 в .asm - работает. Интересный эффект, никогда не сталкивался раньше Видимо придётся в отладчик загружать...
cresta Вобще-то нужно все исходники показывать а также строку компиляции, может ты что с секциями нахимичил и у твоей .data стоит атрибут READONLY
В отладчике программа ломится в ntdll при mov Var,1 и там происходит я понял обработка исключений и Process Terminared Exit Code 80 С секциями я вообще ничего не делал, как RadAsm установил, так и стоит. Исходник тут: P.S. Я там кнопку вставил, так и называется Var dd 0 _564391095__Net Stat.zip
cresta У тебя Var dd 0 расположена в секции .const. У меня masm выдал "Net_Stat.asm(125) : warning A4000: cannot modify READONLY segment". Сделал в Net Stat.Inc так Код (Text): ... Counter dd 0 .data? Var dd 0 hInstance dd ? ... программа работает, т.е. не вылетает с ошибкой.