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..
Benutzeravatar
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
Benutzeravatar
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

Benutzeravatar
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
Benutzeravatar
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
Benutzeravatar
extaler
Newbie
 
Beiträge: 5
Registriert: Donnerstag 18. November 2004, 04:05


Zurück zu Assembler


Social Bookmarking
Bookmark bei: Mr. Wong Bookmark bei: Del.icio.us Bookmark bei: Webnews Bookmark bei: Icio Bookmark bei: Oneview Bookmark bei: Linkarena Bookmark bei: Newskick Bookmark bei: Folkd Bookmark bei: Yigg Bookmark bei: Digg Bookmark bei: Reddit Bookmark bei: Simpy Bookmark bei: StumbleUpon Bookmark bei: Slashdot Bookmark bei: Netscape Bookmark bei: Furl Bookmark bei: Yahoo Bookmark bei: Spurl Bookmark bei: Google Bookmark bei: Blinklist Bookmark bei: Blogmarks Bookmark bei: Diigo Bookmark bei: Technorati Bookmark bei: Newsvine Bookmark bei: Blinkbits Bookmark bei: Ma.Gnolia Bookmark bei: Smarking Bookmark bei: Netvouz

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder