Поиск в массиве

Тема в разделе "WASM.BEGINNERS", создана пользователем FAIR, 27 ноя 2005.

  1. FAIR

    FAIR New Member

    Публикаций:
    0
    Регистрация:
    10 сен 2005
    Сообщения:
    17
    Дан массив двойных слов:
    Код (Text):
    1.  
    2. data.
    3.     hClients        DWORD 64 dup (0)
    4.  


    В процессе работы программы часть елементов массива заполняется ненулевыми значениями.

    Нужно пройтись по всем елементам массива, и если текущий элемент массива не нулевой, то вызвать для него функцию closesocket@4, а потом обнулить этот элемент. Как это наиболее оптимально сделать?

    Мой вариант:
    Код (Text):
    1.  
    2.         mov ecx, 64 ; кол-во элементов
    3.         mov edi, offset hClients
    4. _LP:       
    5.         mov eax, [edi]
    6.         test    eax, eax    ;проверка на 0
    7.         jz  _NEXT_LP
    8.         ; если не 0, то вызываем для него функцию и после этого обнуляем
    9.         push    eax
    10.         call    closesocket@4
    11.         push    0
    12.         pop [edi]
    13. _NEXT_LP:  
    14.         add edi, 4
    15.         loop    _LP
    16.  
     
  2. readme

    readme New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2005
    Сообщения:
    271
    Адрес:
    Russia
    вот поменьше вроде

    movecx, 64; кол-во элементов

    movedi, offset hClients

    _LP:

    lodsd

    test eax, eax;проверка на 0

    jz_NEXT_LP

    ; если не 0, то вызываем для него функцию и после этого обнуляем

    push eax

    call closesocket@4

    mov dword ptr [edi-4],0

    _NEXT_LP:

    loop _LP
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Код (Text):
    1.     mov     ecx, 64
    2.     mov     edi, offset hClients
    3.     jmp     _NEXT_LP
    4.                
    5. _LP:       
    6.     cmp     dword ptr[edi+ecx*4],0
    7.     je      _NEXT_LP
    8.     push    dword ptr[edi+ecx*4]
    9.     mov     dword ptr[edi+ecx*4],0
    10.     call    closesocket@4
    11. _NEXT_LP:  
    12.     dec     ecx
    13.     jns     _LP




    Только нужно позаботиться, чтобы closesocket не модифицировала ecx. Или в качестве счётчика взять esi или ebx.
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    А зачем проверять на ноль перед вызовом closesocket, если функция сама проверит валидность параметра (она ведь это делает?).

    Ну вернет функция ошибку, ты же все равно это не обрабатываешь. Число элементов небольшое, т.ч. особой задержки при закрытии всех сокетов, даже инвалидных, не будет.


    Код (Text):
    1.  
    2.     mov     ecx, 63
    3.     mov     edi, offset hClients
    4. _LP:       
    5.     push    dword ptr[edi+ecx*4]
    6.     mov     dword ptr[edi+ecx*4],0
    7.     call    closesocket@4
    8.     dec     ecx
    9.     jns     _LP
    10.  
     
  5. FAIR

    FAIR New Member

    Публикаций:
    0
    Регистрация:
    10 сен 2005
    Сообщения:
    17


    Валидность то проверяет, но мне кажется это будет медленнее, чем в варианте с проверкой на ноль...
     
  6. FAIR

    FAIR New Member

    Публикаций:
    0
    Регистрация:
    10 сен 2005
    Сообщения:
    17
    Кстати, надо еще учитывать, что closesocket может изменять значение ecx (вроде она так и делает)
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Конечно нулевой сокет функция не закроет, вот только вызывать её для того, чтобы она ничего не сделала - несколько странно. Да и медленнее, чем cmp/jz _NEXT_LP



    closesocket может изменять значение ecx



    Ну так используй в качестве счётчика вместо ecx какой-нибудь регистр, который она не меняет, например ebx.