String in einer Textdatei suchen

Hier könnt ihr sowohl zur x86 Architektur als auch zu Win32ASM Fragen stellen.

Moderatoren: crack, Krüsty, Marwin

Beitragvon extaler » Donnerstag 18. November 2004, 04:09

Hola!
Ich will das folgende kleine Programm etwas modifizieren -
Funktion des Programms: öffnet eine Datei sucht nach nem String und gibt die Anzahl an wie oft der String gefunden wurde.
Und zwar will ich die Datei in der gesucht werden soll und den String der gesucht werden soll am DOS-Prompt angeben und nicht wie im unteren Code - hier ist die Datei und der String schon im Quellcode vorgegeben
filename db Kapitel1.txt,0h
string db der


kann mir da einer weiterhelfen?


Code: Alles auswählen

.model tiny                 ;nur ein kleines Programm
 .code                       ;hier steht der code
 org 100h                    ;wir basteln ne COM Datei

 START:                      ;Label zum verzieren

  mov ah, 3dh                ;"ffnen der autoexec.bat
  xor al, al                 ;nur zum lesen..
  lea dx, filename           ;dx zeigt auf den Dateinamen
  int 21h
  jc Ende                    ;wenn es irgendwelche Fehler gibt beenden wir..

  mov bx, ax                 ;speichern des Handels

  mov ax, 4202h              ;gehe zum Ende der Datei..
  xor cx, cx                 ;cx = dx = 0
  xor dx, dx
  int 21h
    
  push ax                    ;ax ist die L"nge des Dateiinhaltes, wenn
                             ;sie kleiner als 64kb ist..;)
                             ;der Rest steht in DX

  mov ax, 4200h              ;gehe zum anfang der Datei
  xor cx,cx                  ;CX=DX=0
  xor dx,dx
  int 21h

  mov ah, 3fh                ;lesen der gesamten Datei
  pop cx                     ;in den Buffer
  push cx                    ;speicher die Dateil"nge wieder im Stack
  lea dx, buffer
  int 21h

  mov ah, 3eh                ;die Datei wird geschlossen
  int 21h

  mov dx, 0h                 ;Setze dx als Z"hler auf 0

  lea di, buffer             ;hier fangen wir an zu suchen

SearchOn:
  pop cx                     ;Dateil"nge in cx
  lea si, string             ;was wollen wir finden ?
  lodsb                      ;lade das erste Byte in ax

  repnz scasb                ;Suche starten
  cmp cx,0                   ;wenn cx=0 dann wurde alles durchsucht..
  jz disp                    ;Ergebnisse anzeigen
  push cx

  mov cx, laenge             ;den Rest des Strings vergleichen
  repz cmpsb

  cmp cx,0                   ;kompletter String gleich ?
  jnz SearchOn               ;wenn nicht weitersuchen
  
  inc dx                     ;Z"hler erh"hen
  pop cx                     ;Restliche L"nge ?berpr?fen
  push cx
  cmp cx, 0
  jne SearchOn               ;weitersuchen
  jmp disp                   ;anzeigen

 disp:
  lea di, showstring         ;in di ist der String den wir anzeigen wollen

  mov ax, dx                 ;wenn dx < 10 dann wird er umgerechnet in Dezimal
  cmp ax, 10d
  jnae showit
  cmp ax, 100d
  jae toogreat
  xor dx, dx
  mov cl, 10d
  div cl

  add dl, 48d
  mov byte ptr cs:[di], dl
  add al, 48d
  mov byte ptr cs:[di], al
  inc di


 showit:
  add dl, 48d
  mov byte ptr cs:[di], dl

 lea dx, showstring         ;Anzeigen
 mov ah, 9h
 int 21h

 Ende:

  mov ah, 4ch               ;Beenden..
  int 21h

 toogreat:                  ;Zahl ist gr" er als 9
  lea dx, toogre
  mov ah, 9h
  int 21h
 jmp Ende

 filename db Kapitel1.txt,0h
 string   db der
 laenge   equ $-offset string
 toogre   db String "fters als 9 mal gefunden,10d,13d,$
 showstring db   ,10d,13d,$
 buffer:

 END START                  ;hier ist das ganze zuende..
extaler
Newbie
 
Beiträge: 5
Registriert: Donnerstag 18. November 2004, 04:05

Beitragvon Marwin » Freitag 19. November 2004, 16:12

Hallo extaler,

dazu gibt es die Funktion 0Ah des DOS-Interrupts 21h.
Auf dieser Seite findest du unter Neue Funktionen =] A. (untere Hälfte der Seite) eine kurze Beschreibung und ein Beispielcode dazu:
http://www.assembler.my100megs.com/asm9.htm

Grüße, Marwin
Benutzeravatar
Marwin
Moderator
 
Beiträge: 307
Registriert: Donnerstag 8. Mai 2003, 21:19
Wohnort: Seelow, Deutschland

Beitragvon extaler » Dienstag 23. November 2004, 00:04

Hallo Marwin
-danke für den Tipp
Ich habe das Programm etwas umgeschrieben - beim kompilieren mit Tasm und dem Linken mit Tlink gibts es keine Fehlermeldungen.
Allerdings kann die Datei nicht geöffnet werden in der gesucht werden soll - woran kann das liegen?
die Datei(kap1.txt) in der ich suchen will liegt im selben Verzeichniss wie das Programm.
Also am Promt erscheint jetzt folgendes:
Geben sie das zu suchende Wort ein: der
In welcher Datei soll gesucht werden?: kap1.txt
Datei konnte nicht geoeffnet werden


Hier der Code:
Code: Alles auswählen
.MODEL SMALL
                     .STACK 100h
                     .DATA
;
Msg1                 DB   10,13,"Geben sie das zu suchende Wort ein: $"
Msg2                 DB   10,13,"$"
Puffer               STRUC                      ;Stuktur definieren
       Max            DB   50                    ;Maximale Anzahl Zeichen
       Anz            DB   ?                      ;Fkt gibt hier die Anz. der eingegebenen Zeichen rein
       Txt             DB   53 DUP (?)          ;Hier der eigentliche Text
Puffer               ENDS
BufStrc              Puffer <>                  ;Speicherplatz  fuer Puffer1!
;
Msg3                 DB   10,13,"In welcher Datei soll gesucht werden?: $"
;
Puffer2               STRUC                      ;Stuktur definieren
       Max            DB   50                    ;Maximale Anzahl Zeichen
       Anz             DB   ?                      ;Fkt gibt hier die Anz. der eingegebenen Zeichen rein
       Txt              DB   53 DUP (?)        ;Hier der eigentliche Text
Puffer2               ENDS
BufStrc2              Puffer2 <>              ;Speicherplatz  fuer Puffer2!
;
laenge   equ $-offset BufStrc.Txt
showstring db "  ",10d,13d,"$"
toogre   db "String oefters als 9 mal gefunden",10d,13d,"$"
datfehler   db "Datei konnte nicht geoeffnet werden",10d,13d,"$"
                     .CODE
                     mov  ax,@data
                     mov  ds,ax
      
                     mov  ah,09h
                     lea  dx,Msg1
                     int  21h
;      
                     lea  dx,BufStrc              ;in dx der Puffer
                     mov  ah,0Ah        
                     int  21h                    ;Zeichen eingeben
;      
                     mov  bx,dx
;      
                     lea  dx,Msg2        
                     mov  ah,09h
                     int  21h                    ;CR LF
      
                     add  bx,2                    ;plus 2 (Max u. Anz !)
                     add  bl,BufStrc.Anz          ;Ans Ende des Textes!
                    ;adc  bh,0  Falls Ueberlauf
      
                     mov  word ptr ds:[bx],0D0Ah  ;CR LF anhaengen
                     mov  byte ptr ds:[bx+2],"$"  ;$ fuer Fkt. 09h anhaengen

                     mov  ah,09h
                     lea  dx,Msg3
                     int  21h
;      
                     lea  dx,BufStrc2              ;in dx der Puffer
                     mov  ah,0Ah        
                     int  21h                      ;Zeichen eingeben
;      
                     mov  bx,dx
;      
                     lea  dx,Msg2        
                     mov  ah,09h
                     int  21h                    ;CR LF
      
                     add  bx,2                    ;plus 2 (Max u. Anz !)
                     add  bl,BufStrc.Anz          ;Ans Ende des Textes!
                    ;adc  bh,0  Falls Ueberlauf
      
                    
                     mov  byte ptr ds:[bx+2],0H  ;0h an dateinamen anhängen
;
;                      
                     mov ah, 3dh                  ;Öffnen der Datei
                     xor al, al                  ;nur zum lesen..
                     lea dx, BufStrc.Txt          ;dx zeigt auf den Dateinamen
                     int 21h
                     jc dateifehler              ;wenn es irgendwelche Fehler gibt beenden wir..

                     mov bx, ax                  ;speichern des Handels

                     mov ax, 4202h                ;gehe zum Ende der Datei..
                     xor cx, cx                  ;cx = dx = 0
                     xor dx, dx
                     int 21h
  
                     push ax                    ;ax ist die L"nge des Dateiinhaltes, wenn
                                                ;sie kleiner als 64kb ist..;)
                                                ;der Rest steht in DX

                     mov ax, 4200h              ;gehe zum anfang der Datei
                     xor cx,cx                  ;CX=DX=0
                     xor dx,dx
                     int 21h

                     mov ah, 3fh                ;lesen der gesamten Datei
                     pop cx                    ;in den Buffer
                     push cx                    ;speicher die Dateil"nge wieder im Stack
                     lea dx, buffer
                     int 21h

                     mov ah, 3eh                ;die Datei wird geschlossen
                     int 21h

                     mov dx, 0h                ;Setze dx als Z"hler auf 0

                     lea di, buffer            ;hier fangen wir an zu suchen

SearchOn:
                     pop cx                    ;Dateilänge in cx
                     lea si, BufStrc.Txt        ;was wollen wir finden ?
                     lodsb                      ;lade das erste Byte in ax

                     repnz scasb                ;Suche starten
                     cmp cx,0                  ;wenn cx=0 dann wurde alles durchsucht..
                     jz disp                    ;Ergebnisse anzeigen
                     push cx

                     mov cx, laenge            ;den Rest des Strings vergleichen
                     repz cmpsb

                     cmp cx,0                  ;kompletter String gleich ?
                     jnz SearchOn              ;wenn nicht weitersuchen
  
                     inc dx                    ;Zähler erhöhen
                     pop cx                    ;Restliche Länge überprüfen
                     push cx
                     cmp cx, 0
                     jne SearchOn              ;weitersuchen
                     jmp disp                  ;anzeigen

 disp:
                     lea di, showstring        ;in di ist der String den wir anzeigen wollen

                     mov ax, dx                ;wenn dx < 10 dann wird er umgerechnet in Dezimal
                     cmp ax, 10d
                     jnae showit
                     cmp ax, 100d
                     jae toogreat
                     xor dx, dx
                     mov cl, 10d
                     div cl

                     add dl, 48d
                     mov byte ptr cs:[di], dl
                     add al, 48d
                     mov byte ptr cs:[di], al
                     inc di


 showit:
                     add dl, 48d
                     mov byte ptr cs:[di], dl

                     lea dx, showstring        ;Anzeigen
                     mov ah, 9h
                     int 21h

 Ende:

                     mov ah, 4ch              ;Beenden..
                     int 21h

dateifehler:  
                     lea dx, datfehler
                     mov ah, 9h
                     int 21h
                     jmp Ende    
          
 toogreat:          ;Zahl ist gr" er als 9
                     lea dx, toogre
                     mov ah, 9h
                     int 21h
                     jmp Ende
 
  
 buffer:
                     END





Grüße
extaler
Newbie
 
Beiträge: 5
Registriert: Donnerstag 18. November 2004, 04:05

Beitragvon Marwin » Dienstag 23. November 2004, 15:30

Laß dir doch einmal bitte den Fehlercode, der in AX gespeichert ist, ausgeben.

[!--QuoteBegin--http://www.assembler.my100megs.com/asm9.htm+--][/span][table border=0 align=center width=95% cellpadding=3 cellspacing=1][tr][td]QUOTE (http://www.assembler.my100megs.com/asm9.htm)[/td][/tr][tr][td id=QUOTE][!--QuoteEBegin--]AX = 1 = Datei schon geöffnet
AX = 2 = Datei nicht gefunden
AX = 3 = Pfad nicht gefunden
AX = 4 = Kein freies Handle
AX = 5 = Zugriff verweigert[/quote]

Grüße, Marwin
Benutzeravatar
Marwin
Moderator
 
Beiträge: 307
Registriert: Donnerstag 8. Mai 2003, 21:19
Wohnort: Seelow, Deutschland

Beitragvon extaler » Dienstag 23. November 2004, 22:25

Hi Marwin
ich hab es soweit hinbekommen dass die Datei dessen Dateiname am Prompt eingegeben wird geöffnet wird und nach dem String gesucht wird der am Promt eingegeben wurde - allerdings bekomme ich als Ergebniss immer eine 1 ausgespuckt - egal wie oft der String in derDatei vorkommt. Mann - ich könnt ... :wacko:

Code: Alles auswählen
.MODEL LARGE
                     .STACK 100h
                     .DATA
;
Msg1                 DB   10,13,"Geben sie das zu suchende Wort ein: $"
Msg2                 DB   10,13,"$"
Puffer               STRUC                      ;Stuktur definieren
       Max           DB   50                    ;Maximale Anzahl Zeichen
       Anz           DB   ?                      ;Fkt gibt hier die Anz. der eingegebenen Zeichen rein
       Txt           DB   53 DUP (?)            ;Hier der eigentliche Text
Puffer               ENDS
BufStrc              Puffer <>                  ;Speicherplatz  fuer Puffer1!
;
Msg3                 DB   10,13,"In welcher Datei soll gesucht werden?: $"
;
Puffer2               STRUC                      ;Stuktur definieren
       Max           DB   50                    ;Maximale Anzahl Zeichen
       Anz           DB   ?                      ;Fkt gibt hier die Anz. der eingegebenen Zeichen rein
       Txt           DB   53 DUP (?)            ;Hier der eigentliche Text
Puffer2               ENDS
BufStrc2              Puffer2 <>                ;Speicherplatz  fuer Puffer2!
;
laenge   equ $-offset BufStrc.Txt
showstring db "  ",10d,13d,"$"
toogre   db "String oefters als 99 mal gefunden",10d,13d,"$"
datfehler   db "Datei konnte nicht geoeffnet werden",10d,13d,"$"
buffer   db      61440 DUP (?)                  ; Puffer für Text aus Datei
                     .CODE
                     mov  ax,@data
                     mov  ds,ax
      
                     mov  ah,09h
                     lea  dx,Msg1
                     int  21h
;      
                     lea  dx,BufStrc              ;in dx der Puffer
                     mov  ah,0Ah        
                     int  21h                    ;Zeichen eingeben
;      
                     mov  bx,dx
;      
                     lea  dx,Msg2        
                     mov  ah,09h
                     int  21h                    ;CR LF
      
                     add  bx,2                    ;plus 2 (Max u. Anz !)
                     add  bl,BufStrc.Anz          ;Ans Ende des Textes!
                    
      
                     mov  word ptr ds:[bx],"$"    ;$ anhaengen
                    
      
                     lea dx, BufStrc.Txt
                     mov ah,09h
                     int 21h
      
                     lea  dx,Msg2        
                     mov  ah,09h
                     int  21h                    ;CR LF

                     mov  ah,09h
                     lea  dx,Msg3
                     int  21h
;      
                     lea  dx,BufStrc2              ;in dx der Puffer
                     mov  ah,0Ah        
                     int  21h                      ;Zeichen eingeben
;      
                     mov  bx,dx
;      
                     lea  dx,Msg2        
                     mov  ah,09h
                     int  21h                    ;CR LF
      
                     add  bx,2                    ;plus 2 (Max u. Anz !)
                     add  bl,BufStrc2.Anz        ;Ans Ende des Textes!
                    ;adc  bh,0  Falls Ueberlauf
      
                    
                     mov  byte ptr ds:[bx],0H  ;0h an dateinamen anhängen
      
                     lea dx, BufStrc2.Txt
                     mov ah,09h
                     int 21h
      
                     lea  dx,Msg2        
                     mov  ah,09h
                     int  21h                    ;CR LF
;
;                      
                     mov ah, 3dh                  ;Öffnen der Datei
                     xor al, al                  ;nur zum lesen..
                     lea dx, BufStrc2.Txt        ;dx zeigt auf den Dateinamen
                     int 21h
                     jc dateifehler              ;wenn es irgendwelche Fehler gibt beenden wir..

                     mov bx, ax                  ;speichern des Handels

                     mov ax, 4202h                ;gehe zum Ende der Datei..
                     xor cx, cx                  ;cx = dx = 0
                     xor dx, dx
                     int 21h
  
                     push ax                    ;ax ist die Länge des Dateiinhaltes, wenn
                                                ;sie kleiner als 64kb ist..;)
                                                ;der Rest steht in DX

                     mov ax, 4200h              ;gehe zum anfang der Datei
                     xor cx,cx                  ;CX=DX=0
                     xor dx,dx
                     int 21h

                     mov ah, 3fh                ;lesen der gesamten Datei
                     pop cx                    ;in den Buffer
                     push cx                    ;speicher die Dateilänge wieder im Stack
                     lea dx, buffer
                     int 21h

                     mov ah, 3eh                ;die Datei wird geschlossen
                     int 21h

                     mov dx, 0h                ;Setze dx als Zähler auf 0

                     lea di, buffer            ;hier fangen wir an zu suchen

SearchOn:
                     pop cx                    ;Dateilänge in cx
                     lea si, BufStrc.Txt        ;was wollen wir finden ?
                     lodsb                      ;lade das erste Byte in ax

                     repnz scasb                ;Suche starten
                     cmp cx,0                  ;wenn cx=0 dann wurde alles durchsucht..
                     jz disp                    ;Ergebnisse anzeigen
                     push cx

                     mov cx, laenge            ;den Rest des Strings vergleichen
                     repz cmpsb

                     cmp cx,0                  ;kompletter String gleich ?
                     jnz SearchOn              ;wenn nicht weitersuchen
  
                     inc dx                    ;Zähler erhöhen
                     pop cx                    ;Restliche Länge überprüfen
                     push cx
                     cmp cx, 0
                     jne SearchOn              ;weitersuchen
                     jmp disp                  ;anzeigen

 disp:
                     lea di, showstring        ;in di ist der String den wir anzeigen wollen

                     mov ax, dx                ;wenn dx > 10 dann wird er umgerechnet in Dezimal
                     cmp ax, 10d
                     jnae einer
                     cmp ax, 100d
                     jae toogreat
                     xor dx, dx
                     mov cl, 10d
                     div cl

  
                     add al, 48d
                     mov byte ptr ds:[di], al
                     inc di
                     add ah, 48d
                     mov byte ptr ds:[di], ah
                     jmp showit


einer:
                     add dl, 48d
                     mov byte ptr ds:[di], dl
      
  
showit:
                     lea dx, showstring        ;Anzeigen
                     mov ah, 9h
                     int 21h
      

Ende:

                     mov ah, 4ch              ;Beenden..
                     int 21h

dateifehler:  
                     lea dx, datfehler
                     mov ah, 9h
                     int 21h
                     jmp Ende    
          
toogreat:          ;Zahl ist größer als 99
                     lea dx, toogre
                     mov ah, 9h
                     int 21h
                     jmp Ende
 
  

                     END

extaler
Newbie
 
Beiträge: 5
Registriert: Donnerstag 18. November 2004, 04:05

Beitragvon Marwin » Dienstag 23. November 2004, 22:29

Das heißt, der Fehlercode ist 1?

Marwin
Benutzeravatar
Marwin
Moderator
 
Beiträge: 307
Registriert: Donnerstag 8. Mai 2003, 21:19
Wohnort: Seelow, Deutschland

Beitragvon extaler » Dienstag 23. November 2004, 22:31

Marwin hat geschrieben: Das heißt, der Fehlercode ist 1?

Marwin

nein, nein beim öffnen der Datei gibt es keine Fehler mehr
nur bei der Anzahl der Gefundenen Strings - bekomme ich immer eine 1 als Rückgabewert
extaler
Newbie
 
Beiträge: 5
Registriert: Donnerstag 18. November 2004, 04:05

Beitragvon extaler » Dienstag 23. November 2004, 22:38

weil ich dann ne fehlermeldung bekomme, dass die Operanden Typen nicht zueinander passen
BufStrc.Anz ist ein Byte groß --> bx ist zwei Byte groß
daher muss ich auf bl
extaler
Newbie
 
Beiträge: 5
Registriert: Donnerstag 18. November 2004, 04:05


Zurück zu Assembler

 


  • { RELATED_TOPICS }
    Antworten
    Zugriffe
    Letzter Beitrag

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron