Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ASM] wyświetlanie plików ich ....

ViRuS2999 29 Mar 2010 22:46 1146 0
  • #1 29 Mar 2010 22:46
    ViRuS2999
    Poziom 11  

    Witam serdecznie,

    wojuje od pewnego czasu z programem,
    1.ma wyświetlacz pliki ich atrybuty(prawie działa, nie pokazuje plików systemowych i ukrytych)
    2.dodatkowo ma wyświetlać datę ich utworzenia i tu mam problem by całość posklejać w jedno kupę, program można powiedzieć składa się z dwóch części

    będę wdzięczny za jakiekolwiek wskazówki co gdzie...
    Pozdrawiam

    aktualne dzieło

    Code:

    format binary
    org 100h
    start:
            lea dx,[NEW_DTA]
            mov ah,1ah
            int 21h

    FINDFIRST:        mov ah,4eh                    ; DOS find first service
                      lea dx,[file_mask]            ; Search for any file
                      xor cx,cx                     ; Attribute mask: cx=0



    FINDNEXT:         int 21h                       ; Call DOS to do it
                      jc NoFile                     ; Quit if there are errors
                                                    ; or no more files

      lea si,[NEW_DTA+30]           ; Point to filename we found
                      lea di,[FileName]           ; Copy it to FileName ...
                      mov cx,13
                      rep movsb                   ; using movsb
                      call PrintFilename1



                          ;atrybut pliku -jest kodowany na 6 ostatnich bitach (5-0)
                     ;;;;;;;;;;;;;;; Atrybuty..
                     
                     
                     
                     ;atrybut pliku -jest kodowany na 6 ostatnich bitach (5-0)
            lea si, [NEW_DTA]

            add si,21




            mov al,[si]    ; bo zwraca wartosc 8-bitową



    dalej0:

              mov [Fileattribute],al
              and al,01h  ; jak jedynka na pierwszym bicie(od lewej) to "tylko do odczytu"
              cmp al,0
              jne tylko_do_odczytu

    dalej1:   mov al,[Fileattribute]
              and al,02h  ; jak jedynka na drugim bicie to "ukryty"
              cmp al,0
              jne ukryty

    dalej2:   mov al,[Fileattribute]
              and al,04h  ; jak jedynka na 3 bicie to "systemowy"
              cmp al,0
              jne systemowy

    dalej3:   mov al,[Fileattribute]
              and al,08h  ; jak jedynka na 4 bicie to "id_dysku"
              cmp al,0
              jne id_dysku

    dalej4:   mov al,[Fileattribute]
              and al,10h  ; jak jedynka na 5 bicie to "podkatalog"
              cmp al,0     
              jne podkatalog

    dalej5:   mov al,[Fileattribute]
              and al,20h  ; jak jedynka na 6 bicie to "arch"
              cmp al,0

              jne archiwum
    jmp dalej

    ;;;;;;;;;   -----------------------------------------------
      ;;;;;;;;;;;;;;;;;;;;
    Filedate dw ?
                    rok dw ?
                    miesiac dw ?
                    dzien dw ?
    ;;;;;;;;;;;;;;;
      lea si,[NEW_DTA]
      add si,24
      mov ax,[si]
      mov [Filedate],ax
     
      call DecodeFiledate
      mov ax, rok
                         lea dx,[Filedate]
                      xor ax,ax

                      mov ah, 9
                      int 21h
      call rokw
      ;call kropka
      mov ax, miesiac
      call miesw
      ;call kropka
      mov ax, dzien
      call dzienw
      ;call kropka
    ;;;;;;;;;;;;;;;;;;;;;;
    DecodeFiledate: ;odkodowanie daty, jest ona zapisana na 16 bitach

      mov ax,0
      mov ax,Filedate
      and ax, 0fe00h   ;maska dla roku, jest on zapiany na 7 najbardziej znaczących bitach
      shr ax,9         ;  wiec wynik and'a przesuwam o 9 bitów w prawo
      add ax,07bch     ;
      mov [rok],ax

      mov ax,0        ;tak samo dla miesiaca (4bity w srodku)
      mov ax,Filedate
      and ax,1e0h      ;maska dla miesiaca
      shr ax,5
      mov [miesiac],ax

      mov ax,0        ;i dla dnia (5 najminiej znaczacych)
      mov ax,Filedate
      and ax,1fh    ;maska dla dnia
      mov [dzien],ax

      mov ax,0
      ret

      DecodeFiledateendp:
     
     
      ;;;;;;;;;;;;;;;;;;;;;;///////////////
      lea si,[NEW_DTA]
      add si,22
      mov ax,[si]
      mov [Filetime],ax
      call DecodeFiletime
      mov ax, godzina
    call godzw

      ;call dwukropek
      mov ax, minuta
      call minw
      ;call dwukropek
      mov ax, sekunda
      call sekw


      ;;;;;;
     
      Filetime dw ?
            godzina dw ?
              minuta dw ?
              sekunda dw ?
    ;;;;;;;;;;;;;;;;;;;;;;
             DecodeFiletime: ;odkodowanie czasu

      mov ax,0
      mov ax,Filetime
      and ax, 0f800h   ;maska dla godziny
      shr ax,11
      mov [godzina],ax

      mov ax,0
      mov ax,Filetime
      and ax,07e0h    ;maska dla minut
      shr ax,5
      mov [minuta],ax

      mov ax,0 
      mov ax,Filetime
      and ax,01fh    ;maska dla sekunda
      shl ax,1       ;mnozenie polowy sek. przez 2
      mov [sekunda],ax
     
      mov ax,0
      ret

      DecodeFiletimeendp:
    ;;;   -----------------------------------------------



    ;WYSWEIETLANIE ODPOWIEDNIEGO NAPISU ADEKWATNEGO DO TYPU PLIKU
    tylko_do_odczytu:
            call odc
            jmp dalej1
    ukryty:
            call ukr
            jmp dalej2
    systemowy:
           call sys
            jmp dalej3
    id_dysku:
            call idd
            jmp dalej4
    podkatalog:
            call podk
            jmp dalej5
    archiwum:     
            call arch
            jmp dalej

    dalej:                 
                     call PrintFilename
                      mov ah,4fh                    ; DOS find next file
                      jmp FINDNEXT                  ; Find another file

    NoFile:
    call nextline    ;przeskok do nastepnej lini na ekranie
    koniec:                                                 ;Blok kończący program
                    mov     ah, 0                           ;
                    int     16h                             ;
                    mov     ax, 4C00h                       ;
                    int     21h
    odc:
            mov dx, odczytywalny
            mov al,9
            int 21h
            ret

    ukr:
            mov dx, ukryty2
            mov al,9
            int 21h
            ret
    sys:
            mov dx, systemowy2
            mov al,9
            int 21h
            ret

    idd:
            mov dx, id_dysku2
            mov al,9
            int 21h
            ret


    podk:
            mov dx, podkatalog2
            mov al,9
            int 21h
            ret

    arch:
            mov dx, archiwizowany2
            mov al,9
            int 21h
            ret

    miesw:
                    mov     ah, 9
                    mov     dx, miesiac  ; wczytanie znakow zawartych w nl do rejestru dx
                    int     21h
                    ret    ;powrot do poprzendniej pozycji w kodzie

    rokw:
                       ; call nextline    ;przeskok do nastepnej lini na ekranie
                      lea dx,[Filedate]
                      xor ax,ax

                      mov ah, 9
                      int 21h
                     ; call nextline    ;przeskok do nastepnej lini na ekranie
                      ret
    dzienw:
                    mov     ah, 9
                    mov     dx, dzien  ; wczytanie znakow zawartych w nl do rejestru dx
                    int     21h
                    ret    ;powrot do poprzendniej pozycji w kodzie
    godzw:
                    mov     ah, 9
                    mov     dx, godzina  ; wczytanie znakow zawartych w nl do rejestru dx
                    int     21h
                    ret    ;powrot do poprzendniej pozycji w kodzie
    minw:
                    mov     ah, 9
                    mov     dx, minuta  ; wczytanie znakow zawartych w nl do rejestru dx
                    int     21h
                    ret    ;powrot do poprzendniej pozycji w kodzie

    sekw:
                    mov     ah, 9
                    mov     dx, sekunda  ; wczytanie znakow zawartych w nl do rejestru dx
                    int     21h
                    ret    ;powrot do poprzendniej pozycji w kodzie


    nextline:
                    mov     ah, 9
                    mov     dx, nl  ; wczytanie znakow zawartych w nl do rejestru dx
                    int     21h
                    ret    ;powrot do poprzendniej pozycji w kodzie


    PrintFilename:
                       ; call nextline    ;przeskok do nastepnej lini na ekranie
                      lea dx,[FileName]
                      xor ax,ax

                      mov ah, 9
                      int 21h
                     ; call nextline    ;przeskok do nastepnej lini na ekranie
                      ret

    PrintFilename1:

                      lea dx,[FileName1]
                      xor ax,ax
                      mov ah, 9
                      int 21h
                      ret



    nl db 10,13,'$' ;nasz enter == nastepna linia

    file_mask         db '*.*',0                    ; maska pliku
    NEW_DTA           db 43 dup(?),10,13,'$'        ; New DTA location
    FileName          db 13 dup(?),10,13,'$'        ; FileName from DTA
    FileName1          db 'Nazwa Pliku: $'        ; FileName from DTA
    napis1   db 'Oto koncowy wynik posortowania: $'

    ;;;;;FileSizeAddr      =NEW_DTA+1AH
    Fileattribute db ?
    odczytywalny db '<odc>$'
    ukryty2 db '<ukr>$'
    systemowy2 db '<sys>$'
    id_dysku2 db '<idd>$'

    podkatalog2 db '<dir>$'
    archiwizowany2 db '<arch>$'





    a oto kod niby pobierający datę z pliku

    Code:

    ;;;;;;;;;;;;;;;;;;;;
    Filedate dw ?
          rok dw ?
          miesiac dw ?
          dzien dw ?
    ;;;;;;;;;;;;;;;
      lea si,NEW_DTA
      add si,24
      mov ax,[si]
      mov Filedate,ax
     
      call DecodeFiledate
      mov ax, rok
      call wypisywanie
      ;call kropka
      mov ax, miesiac
      call wypisywanie
      ;call kropka
      mov ax, dzien
      call wypisywanie
      ;call kropka
    ;;;;;;;;;;;;;;;;;;;;;;
    DecodeFiledate proc   ;odkodowanie daty, jest ona zapisana na 16 bitach

      mov ax,0
      mov ax,Filedate
      and ax, 0fe00h   ;maska dla roku, jest on zapiany na 7 najbardziej znacz¹cych bitach
      shr ax,9      ;  wiec wynik and'a przesuwam o 9 bitów w prawo
      add ax,07bch      ;
      mov rok,ax

      mov ax,0     ;tak samo dla miesiaca (4bity w srodku)
      mov ax,Filedate
      and ax,1e0h      ;maska dla miesiaca
      shr ax,5
      mov miesiac,ax

      mov ax,0     ;i dla dnia (5 najminiej znaczacych)
      mov ax,Filedate
      and ax,1fh   ;maska dla dnia
      mov dzien,ax

      mov ax,0
      ret

      DecodeFiledate endp
     
     
      ;;;;;;;;;;;;;;;;;;;;;;///////////////
       lea si,NEW_DTA
      add si,22
      mov ax,[si]
      mov Filetime,ax
      call DecodeFiletime
      mov ax, godzina
      call wypisywanie
      ;call dwukropek
      mov ax, minuta
      call wypisywanie
      ;call dwukropek
      mov ax, sekunda
      call wypisywanie
      ;;;;;;;;;
     
      Filetime dw ?
       godzina dw ?
         minuta dw ?
         sekunda dw ?
    ;;;;;;;;;;;;;;;;;;;;;;
         DecodeFiletime proc ;odkodowanie czasu

      mov ax,0
      mov ax,Filetime
      and ax, 0f800h   ;maska dla godziny
      shr ax,11
      mov godzina,ax

      mov ax,0
      mov ax,Filetime
      and ax,07e0h     ;maska dla minut
      shr ax,5
      mov minuta,ax

      mov ax,0 
      mov ax,Filetime
      and ax,01fh    ;maska dla sekunda
      shl ax,1    ;mnozenie polowy sek. przez 2
      mov sekunda,ax
     
      mov ax,0
      ret

      DecodeFiletime endp
     



    kolejny kod goły bez wkopiowanego kodu z datami
    Code:

    format binary
    org 100h
    start:
            lea dx,[NEW_DTA]
            mov ah,1ah
            int 21h

    FINDFIRST:        mov ah,4eh                    ; DOS find first service
                      lea dx,[file_mask]            ; Search for any file
                      xor cx,cx                     ; Attribute mask: cx=0



    FINDNEXT:         int 21h                       ; Call DOS to do it
                      jc NoFile                     ; Quit if there are errors
                                                    ; or no more files

      lea si,[NEW_DTA+30]           ; Point to filename we found
                      lea di,[FileName]           ; Copy it to FileName ...
                      mov cx,13
                      rep movsb                   ; using movsb
                       call PrintFilename1



                          ;atrybut pliku -jest kodowany na 6 ostatnich bitach (5-0)
                     ;;;;;;;;;;;;;;; Atrybuty..
                     
                     
                     
                     ;atrybut pliku -jest kodowany na 6 ostatnich bitach (5-0)
            lea si, [NEW_DTA]

            add si,21
            mov al,[si]    ; bo zwraca wartosc 8-bitową



    dalej0:

              mov [Fileattribute],al
              and al,01h  ; jak jedynka na pierwszym bicie(od lewej) to "tylko do odczytu"
              cmp al,0
              jne tylko_do_odczytu

    dalej1:   mov al,[Fileattribute]
              and al,02h  ; jak jedynka na drugim bicie to "ukryty"
              cmp al,0
              jne ukryty

    dalej2:   mov al,[Fileattribute]
              and al,04h  ; jak jedynka na 3 bicie to "systemowy"
              cmp al,0
              jne systemowy

    dalej3:   mov al,[Fileattribute]
              and al,08h  ; jak jedynka na 4 bicie to "id_dysku"
              cmp al,0
              jne id_dysku

    dalej4:   mov al,[Fileattribute]
              and al,10h  ; jak jedynka na 5 bicie to "podkatalog"
              cmp al,0     
              jne podkatalog

    dalej5:   mov al,[Fileattribute]
              and al,20h  ; jak jedynka na 6 bicie to "arch"
              cmp al,0

              jne archiwum
    jmp dalej







    ;WYSWEIETLANIE ODPOWIEDNIEGO NAPISU ADEKWATNEGO DO TYPU PLIKU
    tylko_do_odczytu:
            call odc
            jmp dalej1
    ukryty:
            call ukr
            jmp dalej2
    systemowy:
           call sys
            jmp dalej3
    id_dysku:
            call idd
            jmp dalej4
    podkatalog:
            call podk
            jmp dalej5
    archiwum:     
            call arch
            jmp dalej

    dalej:                 
                     call PrintFilename
                      mov ah,4fh                    ; DOS find next file
                      jmp FINDNEXT                  ; Find another file

    NoFile:
    call nextline    ;przeskok do nastepnej lini na ekranie
    koniec:                                                 ;Blok kończący program
                    mov     ah, 0                           ;
                    int     16h                             ;
                    mov     ax, 4C00h                       ;
                    int     21h
    odc:
            mov dx, odczytywalny
            mov al,9
            int 21h
            ret

    ukr:
            mov dx, ukryty2
            mov al,9
            int 21h
            ret
    sys:
            mov dx, systemowy2
            mov al,9
            int 21h
            ret

    idd:
            mov dx, id_dysku2
            mov al,9
            int 21h
            ret


    podk:
            mov dx, podkatalog2
            mov al,9
            int 21h
            ret

    arch:
            mov dx, archiwizowany2
            mov al,9
            int 21h
            ret

    nextline:
                    mov     ah, 9
                    mov     dx, nl  ; wczytanie znakow zawartych w nl do rejestru dx
                    int     21h
                    ret    ;powrot do poprzendniej pozycji w kodzie


    PrintFilename:
                       ; call nextline    ;przeskok do nastepnej lini na ekranie
                      lea dx,[FileName]
                      xor ax,ax

                      mov ah, 9
                      int 21h
                     ; call nextline    ;przeskok do nastepnej lini na ekranie
                      ret

    PrintFilename1:

                      lea dx,[FileName1]
                      xor ax,ax
                      mov ah, 9
                      int 21h
                      ret



    nl db 10,13,'$' ;nasz enter == nastepna linia

    file_mask         db '*.*',0                    ; maska pliku
    NEW_DTA           db 43 dup(?),10,13,'$'        ; New DTA location
    FileName          db 13 dup(?),10,13,'$'        ; FileName from DTA
    FileName1          db 'Nazwa Pliku: $'        ; FileName from DTA
    napis1   db 'Oto koncowy wynik posortowania: $'

    ;;;;;FileSizeAddr      =NEW_DTA+1AH
    Fileattribute db ?
    odczytywalny db '<odc>$'
    ukryty2 db '<ukr>$'
    systemowy2 db '<sys>$'
    id_dysku2 db '<idd>$'

    podkatalog2 db '<dir>$'
    archiwizowany2 db '<arch>$'



    z góry dziękuje

    0 0