Проблема с локальной переменной

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

Статус темы:
Закрыта.
  1. 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 - в еах оказывается х..ня какая-то, хотя внутри процедуры все гут. подскажите плиз, как сделать.
     
  2. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Приколист. А что должон eax содержать? Возможные варианты:
    адрес строки
    первые четыре символа адреса

    В первом случае по выходу из процедуры eax скорее всего будет содержать... адрес строки, но что произойдет то строкой еще не известно.

    Можно сразу lea eax, str
     
  3. aMAZEd

    aMAZEd New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    10
    dr_dred
    вот именно что ЕАХ содержит адрес строки, но строка запорчена :dntknw:
     
  4. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Дык едо потому что переменная локальная, память под нее выделяется стековая. Сразу после выхода из процедуры, строка не будет испорчена, но потом ее затрут адреса возвратов, сохраненные регистры и локальные переменные других процедур.
    Выход: либо создавать глобальную переменную, либо выделять память под строку.
    На других языках не программируете? Когда это возвращался адрес локальной переменной? Именно поэтому хотя бы GetWindowName запрашивает адрес буфера и его размер.
     
  5. 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
     
  6. aMAZEd

    aMAZEd New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    10
    Буфер результата завел в ф-ии и передал его адрес как параметр ф-ии 'Get_aDDress'.
     
  7. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Да, третий вариант обозначил Mika0x65 в соседнем треде.
    Да, третий вариант обозначил Mika0x65 в соседнем треде (про передачу функции адреса буфера)

    [Добавлено]
    Опоздал.
    За создание расширенной клавиатуры для мобильников!
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Кросспостинг.
     
Статус темы:
Закрыта.