Привет, в этом коде я пытаюсь заменить вручную отдельный байт в строке на другой байт, что, по идее изменит содержимое строки, но почемуто программа завершается аварийно, подскажите пожалуйста как исправить так чтобы работало Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib .DATA sMessage db "Some string to be changed.", 0 sMesTitle db "Title", 0 dwMessageAddr DWORD offset sMesTitle .CODE start: mov dwMessageAddr, offset sMessage mov [dwMessageAddr+2], 97 ; ЗДЕСЬ (по идее) меняю второй байт(букву) в строке на байт 97 (a) invoke MessageBox, NULL, dwMessageAddr, addr sMesTitle, MB_OK invoke ExitProcess, NULL end start
Так работает: Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib .DATA sMessage db "Some string to be changed.", 0 sMesTitle db "Title", 0 .CODE start: mov esi,offset sMessage mov al,97 mov [esi+2], al ; ЗДЕСЬ (по идее) меняю второй байт(букву) в строке на байт 97 (a) invoke MessageBox, NULL, addr sMessage,addr sMesTitle, MB_OK invoke ExitProcess, NULL end start
xlinuks Необязательно, просто нужно понимать что к чему mov [dwMessageAddr+2], 97 означает запись по адресу offset dwMessageAdr+2, т.е. в третий байт переменной dwMessageAddr, а не строки sMessage Поэтому правильно было бы так mov byte ptr [sMessage+1], 97 ;!!! +1 - меняем второй байт, +2 - третий и т.д.
OK leo, твой код работает тоже, а главнее он еще лаконичнее! Это клево. Но теперь когда я решил создать свою процедуру которая заменяет байт в строке (не для оптимизации чегото, а в учебных целях) то происходит следующее, когда я запускаю экзешку из консоли она работает без проблем, но когда при помощи двойного щелчка на экзешке то выдается *Access violation error*, почему так происходит? Ведь и так и так это win32 программа, разница только в том откуда я ее запускаю, а она так странно себя ведет.. Если не трудно взгляните пожалуйста на исходник: Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib str_replace PROTO :dword, :dword, :byte .DATA sMessage db "A sample string", 0 sMesTitle db "Title", 0 .CODE start: invoke str_replace, offset sMessage, dword ptr 10, byte ptr 65 ;mov esi, offset sMessage ;mov [esi+1], byte ptr 65 invoke MessageBox, NULL, offset sMessage, addr sMesTitle, MB_OK invoke ExitProcess, NULL ;========================================================================== str_replace proc dwStringAddress :dword, dwCharOffset :dword, bChar :byte mov edi, dwStringAddress add edi, dwCharOffset add esi, edi mov al, bChar mov [esi], al ;ЗДЕСЬ в винде глючит и в дебаггере пишет *access violation* ret str_replace endp ;=========================================================================== end start
ну дык изначально у тебя esi ваще не инициализируется зачам это делать? просто потом обращайся [edi] или вообще так :
Да, спасибо, я как раз тоже заметил эту ошибку. Я извиняюсь за настойчивость, но как засунуть теперь эту процедуру в структуру? что-то вроде Код (Text): .DATA strucStr struc ;========================================================================== str_replace proc dwStringAddress :dword, dwCharOffset :dword, bChar :byte mov edi, dwStringAddress add edi, dwCharOffset mov esi, edi ;здес было add вместо mov mov al, bChar mov [esi], al ;теперь не глючит ret str_replace endp ;=========================================================================== strucStr ends s strucStr <> .CODE start: invoke s.str_replace, offset sMessage, dword ptr 10, byte ptr 65 не работает, масм 6.14 выдает ошибки и я никак не могу догнать почему. А может в структуре нельзя задавать процедуры? Может есть доки которые описывают эти случаи, я искал и на форуме и в интернете но не нашел ничего про процедуры (с параметрами желательно) внутри структур. Может плохо искал.
ого куда тебя мечта завела =) это не сишные классы, это просто структура. ваще-то так нельзя, если хочеш, можно сделать что-бы в структуре был членом адрес процедуры, потом вызывать его можно но в этом случае процедуру нада написать отдельно а потом помещать её адрес в переменную структуры,но как в таком случае использавть invoke незнаю, может кто подскажет (только через push&call) Кстати намедни чатал сабклассинг Iczelion'a там когда получаеш адрес процедуры сабклашенного окна её рекомендуется вызывать через CallWindowProc, я же вызывал её через push&call и в сразу работало, но в эксерементах с другими окнами выдавало memory cannot be read, интересно почему так происходит?