Дан массив двойных слов: Код (Text): data. hClients DWORD 64 dup (0) В процессе работы программы часть елементов массива заполняется ненулевыми значениями. Нужно пройтись по всем елементам массива, и если текущий элемент массива не нулевой, то вызвать для него функцию closesocket@4, а потом обнулить этот элемент. Как это наиболее оптимально сделать? Мой вариант: Код (Text): mov ecx, 64 ; кол-во элементов mov edi, offset hClients _LP: mov eax, [edi] test eax, eax ;проверка на 0 jz _NEXT_LP ; если не 0, то вызываем для него функцию и после этого обнуляем push eax call closesocket@4 push 0 pop [edi] _NEXT_LP: add edi, 4 loop _LP
вот поменьше вроде 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
Код (Text): mov ecx, 64 mov edi, offset hClients jmp _NEXT_LP _LP: cmp dword ptr[edi+ecx*4],0 je _NEXT_LP push dword ptr[edi+ecx*4] mov dword ptr[edi+ecx*4],0 call closesocket@4 _NEXT_LP: dec ecx jns _LP Только нужно позаботиться, чтобы closesocket не модифицировала ecx. Или в качестве счётчика взять esi или ebx.
А зачем проверять на ноль перед вызовом closesocket, если функция сама проверит валидность параметра (она ведь это делает?). Ну вернет функция ошибку, ты же все равно это не обрабатываешь. Число элементов небольшое, т.ч. особой задержки при закрытии всех сокетов, даже инвалидных, не будет. Код (Text): mov ecx, 63 mov edi, offset hClients _LP: push dword ptr[edi+ecx*4] mov dword ptr[edi+ecx*4],0 call closesocket@4 dec ecx jns _LP
Конечно нулевой сокет функция не закроет, вот только вызывать её для того, чтобы она ничего не сделала - несколько странно. Да и медленнее, чем cmp/jz _NEXT_LP closesocket может изменять значение ecx Ну так используй в качестве счётчика вместо ecx какой-нибудь регистр, который она не меняет, например ebx.