Где сбрасывается CL ?

Тема в разделе "WASM.WIN32", создана пользователем pikador, 3 дек 2008.

  1. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    Пишу тулзу, занимающуюся поиском файлов. Ищу на каждом диске поочереди.
    Занимаясь другим кодом, вдруг обнаружил что диски стали перебираться не с конца и только один без других.
    Хотя код верный! Подскажите где я ступил и т.д. Скорее всего я както не так определил переменную, которая трет остальное.

    Код (Text):
    1. _DATA SEGMENT DWORD PUBLIC USE32 'DATA'
    2.         buf      DB  0
    3.                  DB  100 dup(0)
    4. ...........
    5.         tmp1     DWORD ?
    6.         tmp2     DWORD ?
    7. ............
    8.         num      DB  0
    9.         numf     DWORD  0   ;Счетчик файлов.
    10.         numd     DWORD 0    ;Счетчик каталогов.
    11.         form     DB  "Число найденных файлов:   %lu",0
    12.         form1    DB  "Число найденных  каталогов:   %lu",0
    13. ...........
    14.         lens     DWORD ? ;Количество выведенных символов.
    15.         handl    DWORD ?
    16.         handl1   DWORD ?
    17. ...........
    18. _DATA ENDS
    19. ;Сегмент кода.
    20. _TEXT SEGMENT  DWORD  PUBLIC USE32   'CODE'
    21. START:
    22.             call    FreeConsole@0
    23.             call    AllocConsole@0
    24.             PUSH    STD_OUTPUT_HANDLE
    25.             CALL    GetStdHandle@4
    26.             MOV     handl,EAX
    27.             PUSH    STD_INPUT_HANDLE
    28.             CALL    GetStdHandle@4
    29.             MOV     handl1,EAX    
    30.             PUSH    OFFSET text
    31.             PUSH    OFFSET text
    32.             CALL    CharToOemA@8
    33.             PUSH    OFFSET form
    34.             PUSH    OFFSET form
    35.             CALL    CharToOemA@8
    36.             PUSH    OFFSET form1
    37.             PUSH    OFFSET form1
    38.             CALL    CharToOemA@8
    39.            
    40.             invoke GetWindowsDirectory,offset evil_winpath,260
    41.            
    42.             push 1H
    43.             call  SetErrorMode@4
    44.             invoke lstrcat, offset evil_winpath, offset evil_folder
    45.           replay:  
    46.             call GetLogicalDrives@0        
    47.             mov     ecx,25
    48.             find_drives:
    49.             mov     ebx,1                                           ; Нехитрые операции в
    50.             shl     ebx,cl                                          ; ходе которых мы выясняем
    51.             and     ebx,eax                                         ; присутсвует диск в
    52.             je      no_disk                                         ; системе или нет
    53.             add     cl,65                                           ; Если да, то
    54.             mov     byte ptr buf,cl                                 ; добавим букву
    55.            
    56.  
    57.             sub     cl,65        
    58.       mov     dword ptr buf+1,'\:'                          ; Сформируем строку
    59.       mov     byte ptr buf+3,0  
    60.             ; диска в буффер
    61.        
    62.             push    eax                                             ; Сохраняем нужные
    63.             push    ecx                                             ; регистры в стеке
    64.        
    65.             push offset buf
    66.             CALL     find
    67.  
    68.             pop     ecx                                             ; Восстанавливаем
    69.             pop     eax                                             ; регистры
    70.             jmp     no_disk
    71.             sub     cl,65
    72.         no_disk:                                                      ; Если диска нет,
    73.             dec     ecx                                             ; то проверяем следующий
    74.             jge     find_drives                                     ; пока ecx>0    v
    75.             jmp     replay
    76.            
    77.             push numf
    78.             push offset form
    79.             push offset buf
    80.             call wsprintfA
    81.             lea eax,buf
    82.             mov edi,1
    83.             call write
    84.             push numd
    85.             push offset form1
    86.             push offset buf
    87.             call wsprintfA
    88.             lea eax,buf
    89.             mov edi,1
    90.             call write
    91. _END:
    92.             push     10000
    93.             call     Sleep@4
    94.             PUSH     0
    95.             CALL     ExitProcess@4
    Может у когонибуть было что-то похожее....
    Код вроде тот же, а переменная сама меняется.
    на системе дофига дисков, но файлы перебираются только на "C".
    Да и вообще Начатся перебор должен с буквы Z по A. А прога сразу на С обходя G F E.....
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    только я ничего не понял?
     
  3. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    Я в ecx пишу 25( mov ecx,25), потом в каждом цикле вычитаю еденицу(dec ecx).
    Таким образом перебераемые диски будут идти от Z до А(т.е. ecx будет уменьшатся от 25 до 0)

    а на деле такое не происходит. Всегда почемуто диск "C". Хотя раньше все ок было. Может я где случайно что затер?

    Код (Text):
    1.         call GetLogicalDrives@0        
    2.             mov     ecx,25
    3.             find_drives:
    4.             mov     ebx,1                                           ; Нехитрые операции в
    5.             shl     ebx,cl                                          ; ходе которых мы выясняем
    6.             and     ebx,eax                                         ; присутсвует диск в
    7.             je      no_disk                                         ; системе или нет
    8.             add     cl,65                                           ; Если да, то
    9.             mov     byte ptr buf,cl                                 ; добавим букву
     
  4. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    pikador Прогони под олькой и посмотри где затирается

    Почему не использовать GetLogicalDriveStrings()
     
  5. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    решено. проблема была в кривых руках