Доброго времени суток. Почему-то не работает следующий код: Код (Text): ;-------------------------------------------------------------------------------- ; Получение e-mail адреса ; IN: szBuffer - данные ; at_Pos - позиция "@" ; OUT: eax - результат ;-------------------------------------------------------------------------------- Get_Addr3ss proc uses edi esi ecx szBuffer, at_Pos : DWORD mov esi, szBuffer mov ecx, at_Pos @@: lodsb .IF ((al >= '0') && (al <= '9')) || \ ((al >= 'A') && (al <= 'Z')) || \ ((al >= 'a') && (al <= 'z')) || \ (al == '.') || (al == '_') || \ (al == '-') jmp @B .ENDIF push ecx mov ecx, at_Pos pop edi sub ecx, edi xor edi, edi cld rep movsb @@: lodsb .IF ((al >= '0') && (al <= '9')) || \ ((al >= 'A') && (al <= 'Z')) || \ ((al >= 'a') && (al <= 'z')) || \ (al == '.') || (al == '_') || \ (al == '-') stosb jmp @B .ENDIF mov eax, edi ret Get_Addr3ss endp Подскажите пожалуйста что сделано неправильно. Благодарю за внимание.
сложно понять чего ты хотел изобразить. ну, во-первых, xor edi, edi, с последующим rep movsb, выглядит как явная попытка нарваться на Segmentation Fault...
мне хотелось бы изобразить поиск e-mail адреса. процедура получает данные в которых предположительно находится адрес и положение символа @. нужно влево и вправо от @ протестировать совместимость символов и получить адрес. но похоже я изобрел какую-то лажу...
Не обладая большими телепатическими способностями попробую ответить. 1. Инструкция lodsb без префикса повторения не зависит от ecx и не изменяет его. Соотвественно, надо добавить 'dec ecx' перед 'jmp @B' в первом цикле. 2. 'xor edi, edi' обнулит edi. Win не дает писать по нулевому адресу. Или это не для Win? 3. 'cld' неплохо бы поставить перед первым 'lodsb', если не задумано иначе. 4. 'edi' по выходу из ф-ии будет указывать на конец строки. Так задумывалось? А вообще, неплохо бы написать, под какую платформу пишется, что делает и как именно не работает. Для последнего есть отладчик. UPD: Не успел чуть-чуть .
2 Mika0x65 платформа Win32 состряпал такой код: Код (Text): Get_aDDress proc lpMem, atPos : DWORD LOCAL szEmaIL : DWORD mov esi, lpMem mov ebx, atPos @@: mov al, byte ptr [esi + ebx] .IF ((al >= '0') && (al <= '9')) || \ ((al >= 'A') && (al <= 'Z')) || \ ((al >= 'a') && (al <= 'z')) || \ (al == '.') || (al == '_') || \ (al == '-') dec ebx jmp @B .ENDIF add esi, ebx inc esi mov ecx, atPos sub ecx, ebx lea edi, szEmaIL rep movsb invoke lstrlenA, edi mov ecx, eax mov byte ptr [edi + ecx], '@' xor ebx, ebx inc ebx @@: inc ecx mov al, byte ptr [esi + ebx] .IF ((al >= '0') && (al <= '9')) || \ ((al >= 'A') && (al <= 'Z')) || \ ((al >= 'a') && (al <= 'z')) || \ (al == '.') || (al == '_') || \ (al == '-') mov byte ptr [edi + ecx], al inc ebx jmp @B .ENDIF ;szEmaIL - RESULT ret Get_aDDress endp e-mail получает, но в конце процедуры вылетает с ошибкой в чем может быть причина? и как можно оптимизировать данный код?
код изменился и имеет вид: Код (Text): Get_aDDress proc uses esi edi ecx lpMem, atPos : DWORD LOCAL szEmaIL[32] : BYTE mov esi, lpMem mov ecx, atPos @@: mov al, byte ptr [esi + ecx] .IF ((al >= '0') && (al <= '9')) || \ ((al >= 'A') && (al <= 'Z')) || \ ((al >= 'a') && (al <= 'z')) || \ (al == '.') || (al == '_') || \ (al == '-') || (al == 0) dec ecx jmp @B .ENDIF add esi, ecx inc esi mov eax, ecx mov ecx, atPos sub ecx, eax lea edi, szEmaIL rep movsb mov byte ptr [edi], '@' xor ecx, ecx inc ecx @@: mov al, byte ptr [esi + ecx] .IF ((al >= '0') && (al <= '9')) || \ ((al >= 'A') && (al <= 'Z')) || \ ((al >= 'a') && (al <= 'z')) || \ (al == '.') || (al == '_') || \ (al == '-') || (al != 0) inc ecx jmp @B .ENDIF rep movsb ; szEmaIL - RESULT ret Get_aDDress endp все работает корректно, но появилась проблема: как в ЕАХ поместить содержимое szEmaIL??? пробовал: lea edi, szEmaIL/mov eax, edi - в еах оказывается х..ня какая-то, хотя внутри процедуры все гут. подскажите плиз, как сделать.
Возвращать адрес локальной переменной не имеет смысла -- последующие вызовы процедур уничтожат значения массива. Буфер результата надо заводить в ф-ии, которая будет его использовать и передавать его адрес как параметр ф-ии 'Get_aDDress'.
вы правы. сделал проще. Код (Text): Get_aDDress proc uses esi edi ecx lpMem, szDest, atPos : DWORD mov esi, lpMem mov ecx, atPos @@: mov al, byte ptr [esi + ecx] .IF ((al >= '0') && (al <= '9')) || \ ((al >= 'A') && (al <= 'Z')) || \ ((al >= 'a') && (al <= 'z')) || \ (al == '.') || (al == '_') || \ (al == '-') || (al == 0) dec ecx jmp @B .ENDIF add esi, ecx inc esi mov eax, ecx mov ecx, atPos sub ecx, eax mov edi, szDest rep movsb mov byte ptr [edi], '@' xor ecx, ecx inc ecx @@: mov al, byte ptr [esi + ecx] .IF ((al >= '0') && (al <= '9')) || \ ((al >= 'A') && (al <= 'Z')) || \ ((al >= 'a') && (al <= 'z')) || \ (al == '.') || (al == '_') || \ (al == '-') || (al != 0) inc ecx jmp @B .ENDIF rep movsb ret Get_aDDress endp тему можно закрывать. всем спасибо.