Datei-Operationen

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Antworten
TomCat
MemMaker-Benutzer
Beiträge: 87
Registriert: Do 1. Dez 2011, 17:16

Datei-Operationen

Beitrag von TomCat »

Hallo,

mit den Int 21h - Funktionen ist es ja einfach Dateien zu oeffnen, schliessen, lesen und schreiben. Solange man den Dateinamen kennt! Mir gehts jetzt darum (wie der Befehl: DIR) die Namen der Dateien eines Verzeichnisses zu finden?
Weißt jemand wie man das vom Programm heraus machen koennte?
Int 21h scheint da nix anzubieten, oder taeusche ich mich da?

THX TomCat
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Datei-Operationen

Beitrag von freecrac »

Na klar, zusammen mit "Find Next Matching File":
http://www.htl-steyr.ac.at/~morg/pcinfo ... te83ao.htm

und vorher ein "Get Disk Transfer Address (DTA)"
http://www.htl-steyr.ac.at/~morg/pcinfo ... te2wvk.htm

Besispiel für MASM:

Code: Alles auswählen

.MODEL SMALL
.386
.CODE
 ORG 100h
     mov     ax, 1112h     ; 8x8  Matrix 50 Zeilen
     xor     bl, bl
     int  10h
     mov     ax, @DATA     ; Daten-Segment bestimmen
     mov     ds, ax
     mov     ax, 0B800h    ; Bild-Segment bestimmen
     mov     es, ax
;═════════════════════════════════════════════════════════════════════════
;   Bildschirm loeschen
;═════════════════════════════════════════════════════════════════════════
     xor     di, di
     mov     cx, 9E8h
     mov    eax, 1B201B20h
     rep stosd
     mov     di, 1EA0h
     mov     cx, 28h
     mov    eax, 2B202B20h
     rep stosd
;═════════════════════════════════════════════════════════════════════════
;   Rahmen-malen
;═════════════════════════════════════════════════════════════════════════
     xor     di, di
     mov     al, 0C9h      ;  1 mal "╔" ausgeben
     stosw
     mov     cx, 27h
     mov    eax, 1BCD1BCDh ; 78 mal "═" ausgeben
     rep stosd
     mov     al, 0BBh      ;  1 mal "╗" ausgeben
     stosw
     mov     al, 0BAh      ; 47 mal "║" ausgeben
     mov     cx, 2Fh
P1:       stosb
     add     di, 9Dh
     stosw                 ; 47 mal "║" ausgeben
     loop P1
     mov     al, 0C8h      ;  1 mal "╚" ausgeben
     stosw
     mov     al, 0CDh      ; 78 mal "═" ausgeben
     mov     cl, 27h
     rep stosd
     mov     al, 0BCh      ;  1 mal "╝" ausgeben
     stosb
     mov     al, 0BAh      ; 47 mal "║" ausgeben
     mov     di, 0BAh
     mov     cx, 2Fh
P2:       stosb
     add     di, 19h
     stosb
     add     di, 19h
     stosb
     inc     di
     stosb
     add     di, 19h
     stosb
     add     di, 19h
     stosb
     add     di, 35h
     loop P2
     mov    eax, 1BC41BC4h ; 78 mal "─" ausgeben
     mov     di, 1CC2h
     mov     cl, 27h
     rep stosd
     mov     al, 0CBh      ;  5 mal "╦" ausgeben
     mov     di, 1Ah
     stosb
     add     di, 19h
     stosb
     add     di, 19h
     stosb
     inc     di
     stosb
     add     di, 19h
     stosb
     add     di, 19h
     stosb
     mov     al, 0CAh      ;  5 mal "╩" ausgeben
     mov     di, 1E1Ah
     stosb
     add     di, 19h
     stosb
     add     di, 19h
     stosb
     inc     di
     stosb
     add     di, 19h
     stosb
     add     di, 19h
     stosb
     mov     al, 0D7h      ; "Î" ausgeben
     mov     di, 1CDAh
     stosb
     add     di, 19h
     stosb
     add     di, 19h
     stosb
     inc     di
     stosb
     add     di, 19h
     stosb
     add     di, 19h
     stosb
     mov     al, 0C7h      ; "Ã" ausgeben
     mov     di, 1CC0h
     stosb
     mov     al, 0B6h      ; "Â" ausgeben
     add     di, 9Dh
     stosb
;═════════════════════════════════════════════════════════════════════════
;   LABEL des Laufwerks ausgeben
;═════════════════════════════════════════════════════════════════════════
     mov     dl, 2       ; Laufwerk setzen (0=A;1=B usw.)
     mov    ds:[LAUF], dl
LA:       mov     ah, 0Eh                    
     int   21h
;--------------------------------------
     mov     cx, 8       ; Attribute  LABEL
     call ERE            ; ersten Verzeichniss-Eintrag holen
     jc  DOS
               ;--------------------------------------
     call DITA           ; DTA holen
     mov     dl, LAUF
     sbb     dl, 2
               ;--------------------------------------
     push    ds
     push    es
     pop     ds
     mov     ax, 0B800h
     mov     es, ax
               ;--------------------------------------
     mov     di, 0A6h
     mov     ax, 1Ah
     mul     dl
     add     di, ax
     mov     ah, 1Eh     ; Farbe
     mov     cx, 1Eh     ; Zaehler
               ;--------------------------------------
ILES:     mov     al, ds:[bx] ; ASCII holen
     cmp     al, 0       ; Namens-Ende erreicht ?
     jz  FILEN
     cmp     al, 60h     ; Klein-Buchstaben ?
     jna KLE
     sbb     al, 20h     ; gross machen
KLE:      stosw
     inc     bx
     inc     cx
     cmp     cx, 2Bh     ; schon ganzer Name
     jnz ILES
FILEN:    pop     ds
;═════════════════════════════════════════════════════════════════════════
;   File-Tabelle anlegen
;═════════════════════════════════════════════════════════════════════════
     mov     cx, 21h     ; Attribut alle, ohne System/Hidden/Sub/Label
     call ERE            ; ersten Verzeichniss-Eintrag holen
     jc  DOS
               ;--------------------------------------
     call DITA           ; DTA holen = BX
     lea     bp, TAB     ; Zeiger auf Rett-Tabelle
     xor     si, si
               ;--------------------------------------
NEXT:     mov     bx, DTA     ; Zeiger holen
     mov     cx, 0Ch     ; Zaehler
LESE:     mov     al, es:[bx] ; ASCII holen
               ;--------------------------------------
     cmp     al, 0       ; Ende erreicht ?
     jz  FILEND
     cmp     al, "."     ; schon Punkt erreicht ?
     jnz FEN
               ;--------------------------------------
     add     bp, cx
     mov     cl, 4       ; nur noch 4 Zeichen
     sbb     bp, cx
     mov     al, 20h     ; Space
     jmp  GRO
               ;--------------------------------------
FEN:      cmp     al, 5Bh     ; Gross-Buchstaben ?
     jnb GRO
     cmp     al, 40h     ; Gross-Buchstaben ?
     jb  GRO
     add     al, 20h     ; klein machen
               ;--------------------------------------
GRO:      mov   ds:[bp], al   ; in Tabelle ablegen
     inc     bp
     inc     bx
     loop LESE                    
               ;--------------------------------------
FILEND:   inc     si
     add     bp, cx
     mov     cx, 21h     ; Attribute alle, ohne System/Hidden/Sub/Label
     call NEH            ; Naechsten Eintrag holen
     jnc NEXT
;═════════════════════════════════════════════════════════════════════════
     call ESORT
;═════════════════════════════════════════════════════════════════════════
     call NILOU          ; alle File-Namen eines Laufwerks ausgeben
;═════════════════════════════════════════════════════════════════════════
     call FTR            ; Tabellen-Bereich loeschen
;═════════════════════════════════════════════════════════════════════════
     call LFOUT          ; oben Ausgabe des Laufwerks Buchstaben
;═════════════════════════════════════════════════════════════════════════
     inc    BYTE PTR[LAUF]       ; Laufwerk erhoehen
     mov     dl, BYTE PTR[LAUF]
     cmp     dl, 5
     jnz LA
;═════════════════════════════════════════════════════════════════════════
;═════════════════════════════════════════════════════════════════════════
;═════════════════════════════════════════════════════════════════════════
;   unten Eingabezeile: Pfad/Laufwerk ausgeben
;═════════════════════════════════════════════════════════════════════════
     mov     dx, 3       ; Laufwerk setzen (0=A;1=B usw.)
     mov     ah, 0Eh                    
     int   21h                    
               ;--------------------------------------
     mov     ah, 19h     ; aktuelle Laufwerks-Nr. holen
     int   21h
     inc     al
               ;--------------------------------------
     lea     si, PFAD    ; Pfad holen
     mov     dl, al
     mov     ah, 47h
     int   21h
     jc  DOS
               ;--------------------------------------
     xor     cl, cl
     lea     bx, LFW
     add     bx, dx
     mov     al, [bx]    ; Laufwerks-Ascii holen
     mov     ah, 2Fh
     mov     di, 1EA0h
     stosw               ; Laufwerk
     mov     al, ":"     ; Doppelpunkt
     stosw
     mov     al, "\"     ; Backslash
SUCH0:    stosw
     lodsb               ; Pfad
     inc     cl
     cmp     al, 0
     jnz SUCH0
     mov     al, ">"     ; Backslash
     stosw
               ;--------------------------------------
     mov     dh, 31h     ; Coursor setzen
     mov     dl, 3
     add     dl, cl
     xor     bh, bh
     mov     ah, 2
     int   10h
;═════════════════════════════════════════════════════════════════════════
DOS:      mov     ax, 1
     int   16h
     mov     ax, 4C00h
     int   21h
;═════════════════════════════════════════════════════════════════════════
;═══════════════ S U B ═══════════════════════════════════════════════════
;═════════════════════════════════════════════════════════════════════════
ERE:      mov     ah, 4Eh     ; Ersten Verzeichniss-Eintrag holen
     xor     si, si      ; Anzahl der Namen              
     lea     dx, NAM     ; NAME DS:DX
     int   21h
     ret
;═════════════════════════════════════════════════════════════════════════
NEH:      mov     ah, 4Fh     ; Naechsten Eintrag holen
     lea     dx, NAM     ; NAME DS:DX
     int   21h
     ret
;═════════════════════════════════════════════════════════════════════════
DITA:     mov     ah, 2Fh     ; DTA holen
     int   21h           ;            OUT: ES:BX (Disk Tranfer Adress)
     add     bx, 1Eh     ; Zeiger auf Namen (DTA: 1E - 2A)
     mov    ds:[DTA], bx ; Zeiger retten
     ret
;═════════════════════════════════════════════════════════════════════════
;   sortierung der filenamen Extensionen nach dem Alphabeth
;═════════════════════════════════════════════════════════════════════════
ESORT:    xor     cx, cx
     mov     di, 09h
     mov     bp, di
ES0:      mov     al, BYTE PTR[TAB + di]
ES1:      add     bp, 0Ch
     inc     cx
     cmp     cx, si
     jz   ES2
     cmp     al, BYTE PTR[TAB + bp]
     ja   ES1
     mov     di, bp
     jmp  ES0
ES2:      

     ret
;═════════════════════════════════════════════════════════════════════════
;   alle File-Namen eines Laufwerks ausgeben
;═════════════════════════════════════════════════════════════════════════
NILOU:    mov     fs, si      ; Anzahl retten
     mov     ax, 0B800h
     mov     es, ax
     lea     si, TAB     ; Zeiger auf Tabelle
     mov     bp, fs
     mov     dh, 2       ; ZEILE 2 
               ;--------------------------------------
FILOUT:   mov     ax, 0A0h    ; max.Spalte
     mul     dh          ;   mal Zeile
     mov     di, ax
     add     di, 2
     mov     bl, LAUF  
     sbb     bl, 2
     mov     ax, 1Ah     ; Tab.
     mul     bl
     add     di, ax      ; nur dl dazu
               ;--------------------------------------
     mov     ah, 1Bh     ; Farbe
     mov     cx, 0Ch     ; laenge des File-Namens
NEFI:     lodsb               ; File-Namen ausgeben
     stosw
     loop NEFI
               ;--------------------------------------
     cmp     dh, 2Dh     ; schon letzte Zeile ?
     jz  FUT
     inc     dh
               ;--------------------------------------
     dec     bp          ; schon letztes File ?
     jnz  FILOUT
FUT:      ret
;═════════════════════════════════════════════════════════════════════════
;   Tabellen-Bereich loeschen
;═════════════════════════════════════════════════════════════════════════
FTR:      mov     ax, @DATA
     mov     es, ax
     lea     di, TAB
     mov     ax, 0Eh
     mov     si, fs
     mul     si
     shr     ax, 2
     mov     cx, ax
     mov    eax, 2020h
     rep stosd
     mov     ax, 0B800h
     mov     es, ax
     ret
;═════════════════════════════════════════════════════════════════════════
;   oben Ausgabe des Laufwerks Buchstaben
;═════════════════════════════════════════════════════════════════════════
LFOUT:    xor     dh, dh
     mov     dl, LAUF
     sbb     dl, 2
     mov     ax, 1Ah
     mul     dl
     mov     di, 8
     add     di, ax
     mov     ax, 1F20h
     stosw
     mov     dl, LAUF
     lea     bx, LFW
     add     bx, dx
     inc     bx
     mov     al, [bx]    ; Laufwerks-Ascii holen
     stosw
     mov     al, 3Ah
     stosw
     mov     al, 5Ch
     stosw
     mov     al, 20h
     stosw
     ret
;═════════════════════════════════════════════════════════════════════════
.DATA
LAUF   DB  2                             ; Dos-Laufwerk setzen dl=Laufwerk
NAM    DB  2Ah, 2Eh, 2Ah, 0              ; alle Files "*.*"
LFW    DB  "0ABCDEFGHIJKLMNOPQRSTUVWXYZ" ; Tabelle der Laufwerks-Ascii
DTA    DW  0080h                         ; Offset der DTA
PFAD   DB  64 DUP (0)                    ; aktueller Pfad
TAB    DB  ?                             ; Tabelle der Namens-Eintraege
 org  4000h
TABS   DB  ?                       ; Tabelle der sortierten Namens-Eintraege
;═════════════════════════════════════════════════════════════════════════
 org  8000h
.STACK 20h
 END
Get Current Default Drive
http://www.htl-steyr.ac.at/~morg/pcinfo ... te2t9s.htm

Get Current Directory
http://www.htl-steyr.ac.at/~morg/pcinfo ... te82wg.htm

Ich habe auch gleich noch ein Seite mit einem Artikel darüber gefunden:
http://vx.netlux.org/lib/static/vdat/tuvd0002.htm

Dirk
Brueggi

Re: Datei-Operationen

Beitrag von Brueggi »

Schon krass (im positiven Sinn), was Du da immer "aus dem Ärmel zauberst". :-)
Antworten