Помогите разобраться

Тема в разделе "WASM.BEGINNERS", создана пользователем aMAZEd, 15 июл 2007.

  1. aMAZEd

    aMAZEd New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    10
    Доброго времени суток.

    Почему-то не работает следующий код:

    Код (Text):
    1. ;--------------------------------------------------------------------------------
    2. ; Получение e-mail адреса
    3. ; IN:  szBuffer - данные
    4. ;      at_Pos   - позиция "@"
    5. ; OUT: eax - результат
    6. ;--------------------------------------------------------------------------------
    7. Get_Addr3ss proc uses edi esi ecx szBuffer, at_Pos : DWORD
    8.         mov esi, szBuffer
    9.         mov ecx, at_Pos    
    10. @@:
    11.         lodsb  
    12.            
    13.         .IF ((al >= '0') && (al <= '9')) || \
    14.             ((al >= 'A') && (al <= 'Z')) || \
    15.             ((al >= 'a') && (al <= 'z')) || \
    16.              (al == '.') || (al == '_')  || \
    17.              (al == '-')
    18.              jmp    @B           
    19.         .ENDIF 
    20.        
    21.         push    ecx
    22.         mov ecx, at_Pos
    23.         pop edi
    24.         sub ecx, edi
    25.         xor edi, edi
    26.         cld
    27.         rep movsb      
    28. @@:
    29.         lodsb
    30.        
    31.         .IF ((al >= '0') && (al <= '9')) || \
    32.             ((al >= 'A') && (al <= 'Z')) || \
    33.             ((al >= 'a') && (al <= 'z')) || \
    34.              (al == '.') || (al == '_')  || \
    35.              (al == '-')             
    36.              stosb                       
    37.              jmp    @B           
    38.         .ENDIF     
    39.  
    40.         mov eax, edi
    41.         ret
    42. Get_Addr3ss endp
    Подскажите пожалуйста что сделано неправильно.
    Благодарю за внимание.
     
  2. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    сложно понять чего ты хотел изобразить.
    ну, во-первых, xor edi, edi, с последующим rep movsb, выглядит как явная попытка нарваться на Segmentation Fault...
     
  3. aMAZEd

    aMAZEd New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    10
    мне хотелось бы изобразить поиск e-mail адреса.
    процедура получает данные в которых предположительно находится адрес и положение символа @. нужно влево и вправо от @ протестировать совместимость символов и получить адрес.
    но похоже я изобрел какую-то лажу...
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Не обладая большими телепатическими способностями попробую ответить.

    1. Инструкция lodsb без префикса повторения не зависит от ecx и не изменяет его. Соотвественно, надо добавить 'dec ecx' перед 'jmp @B' в первом цикле.

    2. 'xor edi, edi' обнулит edi. Win не дает писать по нулевому адресу. Или это не для Win?

    3. 'cld' неплохо бы поставить перед первым 'lodsb', если не задумано иначе.

    4. 'edi' по выходу из ф-ии будет указывать на конец строки. Так задумывалось?

    А вообще, неплохо бы написать, под какую платформу пишется, что делает и как именно не работает. Для последнего есть отладчик.

    UPD: Не успел чуть-чуть :).
     
  5. aMAZEd

    aMAZEd New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    10
    2 Mika0x65

    платформа Win32

    состряпал такой код:
    Код (Text):
    1. Get_aDDress proc lpMem, atPos : DWORD
    2.         LOCAL   szEmaIL : DWORD
    3.        
    4.         mov esi, lpMem
    5.         mov ebx, atPos
    6. @@:
    7.         mov al, byte ptr [esi + ebx]       
    8.        
    9.         .IF ((al >= '0') && (al <= '9')) || \
    10.             ((al >= 'A') && (al <= 'Z')) || \
    11.             ((al >= 'a') && (al <= 'z')) || \
    12.              (al == '.') || (al == '_')  || \
    13.              (al == '-')       
    14.             dec ebx
    15.             jmp @B           
    16.         .ENDIF
    17.  
    18.         add esi, ebx
    19.         inc esi
    20.         mov ecx, atPos
    21.  
    22.         sub ecx, ebx
    23.         lea edi, szEmaIL
    24.         rep movsb
    25.  
    26.         invoke  lstrlenA, edi
    27.         mov ecx, eax
    28.         mov byte ptr [edi + ecx], '@'
    29.        
    30.         xor ebx, ebx
    31.         inc ebx
    32.    
    33. @@:
    34.         inc ecx
    35.         mov al, byte ptr [esi + ebx]       
    36.        
    37.         .IF ((al >= '0') && (al <= '9')) || \
    38.             ((al >= 'A') && (al <= 'Z')) || \
    39.             ((al >= 'a') && (al <= 'z')) || \
    40.              (al == '.') || (al == '_')  || \
    41.              (al == '-')   
    42.  
    43.             mov byte ptr [edi + ecx], al           
    44.             inc ebx        
    45.             jmp @B           
    46.         .ENDIF
    47.  
    48.  
    49.  
    50.  
    51.         ;szEmaIL - RESULT
    52.        
    53.        
    54.  
    55.         ret
    56. Get_aDDress endp
    e-mail получает, но в конце процедуры вылетает с ошибкой :dntknw:
    в чем может быть причина?
    и как можно оптимизировать данный код?
     
  6. aMAZEd

    aMAZEd New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    10
    код изменился и имеет вид:

    Код (Text):
    1. Get_aDDress proc uses esi edi ecx lpMem, atPos : DWORD
    2.         LOCAL   szEmaIL[32] : BYTE
    3.        
    4.         mov esi, lpMem
    5.         mov ecx, atPos
    6. @@:
    7.         mov al, byte ptr [esi + ecx]       
    8.        
    9.         .IF ((al >= '0') && (al <= '9')) || \
    10.             ((al >= 'A') && (al <= 'Z')) || \
    11.             ((al >= 'a') && (al <= 'z')) || \
    12.              (al == '.') || (al == '_')  || \
    13.              (al == '-') || (al == 0)  
    14.  
    15.             dec ecx
    16.             jmp @B           
    17.         .ENDIF
    18.  
    19.         add esi, ecx
    20.         inc esi    
    21.         mov eax, ecx       
    22.         mov ecx, atPos     
    23.         sub ecx, eax
    24.         lea edi, szEmaIL
    25.         rep movsb
    26.         mov byte ptr [edi], '@'
    27.         xor ecx, ecx
    28.         inc ecx        
    29. @@:
    30.         mov al, byte ptr [esi + ecx]       
    31.        
    32.         .IF ((al >= '0') && (al <= '9')) || \
    33.             ((al >= 'A') && (al <= 'Z')) || \
    34.             ((al >= 'a') && (al <= 'z')) || \
    35.              (al == '.') || (al == '_')  || \
    36.              (al == '-') || (al != 0)
    37.    
    38.             inc ecx        
    39.             jmp @B           
    40.         .ENDIF
    41.  
    42.         rep movsb
    43.  
    44.        
    45.  
    46.         ; szEmaIL - RESULT
    47.  
    48.         ret
    49. Get_aDDress endp
    все работает корректно, но появилась проблема: как в ЕАХ поместить содержимое szEmaIL???

    пробовал:
    lea edi, szEmaIL/mov eax, edi - в еах оказывается х..ня какая-то, хотя внутри процедуры все гут. подскажите плиз, как сделать.
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Возвращать адрес локальной переменной не имеет смысла -- последующие вызовы процедур уничтожат значения массива. Буфер результата надо заводить в ф-ии, которая будет его использовать и передавать его адрес как параметр ф-ии 'Get_aDDress'.
     
  8. aMAZEd

    aMAZEd New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    10
    вы правы. сделал проще.

    Код (Text):
    1. Get_aDDress proc uses esi edi ecx lpMem, szDest, atPos : DWORD     
    2.         mov esi, lpMem
    3.         mov ecx, atPos
    4. @@:
    5.         mov al, byte ptr [esi + ecx]       
    6.        
    7.         .IF ((al >= '0') && (al <= '9')) || \
    8.             ((al >= 'A') && (al <= 'Z')) || \
    9.             ((al >= 'a') && (al <= 'z')) || \
    10.              (al == '.') || (al == '_')  || \
    11.              (al == '-') || (al == 0)  
    12.  
    13.             dec ecx
    14.             jmp @B           
    15.         .ENDIF
    16.  
    17.         add esi, ecx
    18.         inc esi    
    19.         mov eax, ecx       
    20.         mov ecx, atPos     
    21.         sub ecx, eax   
    22.         mov edi, szDest    
    23.         rep movsb
    24.         mov byte ptr [edi], '@'
    25.         xor ecx, ecx
    26.         inc ecx        
    27. @@:
    28.         mov al, byte ptr [esi + ecx]       
    29.        
    30.         .IF ((al >= '0') && (al <= '9')) || \
    31.             ((al >= 'A') && (al <= 'Z')) || \
    32.             ((al >= 'a') && (al <= 'z')) || \
    33.              (al == '.') || (al == '_')  || \
    34.              (al == '-') || (al != 0)
    35.    
    36.             inc ecx        
    37.             jmp @B           
    38.         .ENDIF
    39.  
    40.         rep movsb
    41.  
    42.         ret
    43. Get_aDDress endp
    тему можно закрывать. всем спасибо.