Пишу тулзу, занимающуюся поиском файлов. Ищу на каждом диске поочереди. Занимаясь другим кодом, вдруг обнаружил что диски стали перебираться не с конца и только один без других. Хотя код верный! Подскажите где я ступил и т.д. Скорее всего я както не так определил переменную, которая трет остальное. Код (Text): _DATA SEGMENT DWORD PUBLIC USE32 'DATA' buf DB 0 DB 100 dup(0) ........... tmp1 DWORD ? tmp2 DWORD ? ............ num DB 0 numf DWORD 0 ;Счетчик файлов. numd DWORD 0 ;Счетчик каталогов. form DB "Число найденных файлов: %lu",0 form1 DB "Число найденных каталогов: %lu",0 ........... lens DWORD ? ;Количество выведенных символов. handl DWORD ? handl1 DWORD ? ........... _DATA ENDS ;Сегмент кода. _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: call FreeConsole@0 call AllocConsole@0 PUSH STD_OUTPUT_HANDLE CALL GetStdHandle@4 MOV handl,EAX PUSH STD_INPUT_HANDLE CALL GetStdHandle@4 MOV handl1,EAX PUSH OFFSET text PUSH OFFSET text CALL CharToOemA@8 PUSH OFFSET form PUSH OFFSET form CALL CharToOemA@8 PUSH OFFSET form1 PUSH OFFSET form1 CALL CharToOemA@8 invoke GetWindowsDirectory,offset evil_winpath,260 push 1H call SetErrorMode@4 invoke lstrcat, offset evil_winpath, offset evil_folder replay: call GetLogicalDrives@0 mov ecx,25 find_drives: mov ebx,1 ; Нехитрые операции в shl ebx,cl ; ходе которых мы выясняем and ebx,eax ; присутсвует диск в je no_disk ; системе или нет add cl,65 ; Если да, то mov byte ptr buf,cl ; добавим букву sub cl,65 mov dword ptr buf+1,'\:' ; Сформируем строку mov byte ptr buf+3,0 ; диска в буффер push eax ; Сохраняем нужные push ecx ; регистры в стеке push offset buf CALL find pop ecx ; Восстанавливаем pop eax ; регистры jmp no_disk sub cl,65 no_disk: ; Если диска нет, dec ecx ; то проверяем следующий jge find_drives ; пока ecx>0 v jmp replay push numf push offset form push offset buf call wsprintfA lea eax,buf mov edi,1 call write push numd push offset form1 push offset buf call wsprintfA lea eax,buf mov edi,1 call write _END: push 10000 call Sleep@4 PUSH 0 CALL ExitProcess@4 Может у когонибуть было что-то похожее.... Код вроде тот же, а переменная сама меняется. на системе дофига дисков, но файлы перебираются только на "C". Да и вообще Начатся перебор должен с буквы Z по A. А прога сразу на С обходя G F E.....
Я в ecx пишу 25( mov ecx,25), потом в каждом цикле вычитаю еденицу(dec ecx). Таким образом перебераемые диски будут идти от Z до А(т.е. ecx будет уменьшатся от 25 до 0) а на деле такое не происходит. Всегда почемуто диск "C". Хотя раньше все ок было. Может я где случайно что затер? Код (Text): call GetLogicalDrives@0 mov ecx,25 find_drives: mov ebx,1 ; Нехитрые операции в shl ebx,cl ; ходе которых мы выясняем and ebx,eax ; присутсвует диск в je no_disk ; системе или нет add cl,65 ; Если да, то mov byte ptr buf,cl ; добавим букву