1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Mitglieder
  3. extaler

Beiträge von extaler

  • Assembler: String in Textdatei suchen

    • extaler
    • 22. November 2004 um 23:19

    Hola
    -danke für die vielen Tipps :winking_face:
    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 dazu:

    Zitat


    .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

    Alles anzeigen



    Wäre für Hilfe dankbar :winking_face:

    Grüße

  • Assembler: String in Textdatei suchen

    • extaler
    • 18. November 2004 um 03:54

    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 verankert
    filename db 'Kapitel1.txt',0h
    string db 'der'


    kann mir da einer weiterhelfen?

    Code
    .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..
    Alles anzeigen

Rechtliches

Impressum

Datenschutzerklärung