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
  • Deutsch
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Assembler: String in Textdatei suchen

    • Frage
  • extaler
  • 18. November 2004 um 03:54
  • Unerledigt
  • extaler
    2
    extaler
    Mitglied
    Punkte
    15
    Beiträge
    2
    • 18. November 2004 um 03:54
    • #1

    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
  • Butthead
    1
    Butthead
    Gast
    • 18. November 2004 um 11:33
    • #2

    glaub nicht, dass es noch viele informatiker gibt, die assembler können. :grinning_squinting_face:
    (die freaks mögen mir diese aussage verzeihen)

    wenn du hier keine antwort bekommst, würd ichs im elektrotechnikerforum versuchen, da gibts sicher noch einige die das können.

  • Lord Binary
    18
    Lord Binary
    Mitglied
    Reaktionen
    11
    Punkte
    3.301
    Beiträge
    647
    • 18. November 2004 um 12:52
    • #3

    Könnte es vermutlich schon (noch), aber warum muß es Assembler sein ?
    In C ginge es in ein paar Minuten, und jeder könnte helfen.
    Ohne lange Einarbeitungszeit ... für die Assemblervariante würd' ich vermutlich wegen mangelnder Übung stundenlang brauchen.
    Da ist die Zeit viel besser in Algorithmenverbesserung angelegt.


    Trading for a living [equities,futures,forex]

  • a9bejo
    21
    a9bejo
    Mitglied
    Reaktionen
    42
    Punkte
    4.697
    Beiträge
    913
    • 18. November 2004 um 13:32
    • #4
    Zitat von Lord Binary

    Könnte es vermutlich schon (noch), aber warum muß es Assembler sein ?
    In C ginge es in ein paar Minuten, und jeder könnte helfen.
    Ohne lange Einarbeitungszeit ... für die Assemblervariante würd' ich vermutlich wegen mangelnder Übung stundenlang brauchen.
    Da ist die Zeit viel besser in Algorithmenverbesserung angelegt.

    er wird schon wissen warum es gerade assembler sein muss.
    Vielleicht eine Hausaufgabe, eine erweiterung zu einem bestehenden programm, oder einfach Anforderung vom Auftraggeber.

    Wenn er einfach nur ein paar substrings zählen wollte, könnte er das auch in python mit nem Einzeiler erreichen.

    Ansonsten geht es mir wie dir: Assembler hab ich zwar gelernt, aber ausserhalb der Ausbildung so gut wie nie verwendet. Ein Programm zu analysieren würde also erstmal viel nachschlagen und probieren erfordern.

    Ich bin aber zuversichtlich, dass sich noch eine helfende Hand finden wird. Schliesslich braucht man ja auf der Uni auch etwas Assembler (Übersetzerbau fällt mir da ein), und der Code scheint gut kommentiert.

    Ausserdem fühlt sich durch Buttheads Kommentar sicher einer von unseren geeks in seiner Ehre gekränkt und ist bereits fleissig am werkeln. :thumb:

    PS: Was für ein Assembler ist das denn eigentlich? Auf was für einer Machine läuft das Programm?

    lg, Benjamin Ferrari, bookworm.at

  • dose
    13
    dose
    Mitglied
    Reaktionen
    4
    Punkte
    1.679
    Beiträge
    335
    • 18. November 2004 um 17:00
    • #5
    Zitat

    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


    Kurzanleitung: Du mußt die Kommandozeilen-Argumente "parsen", die stehen irgendwo zwischen 0h und 100h (ich glaub >80h, aber weiß nicht mehr genau wo) und sind durch Leerzeichen getrennt und mit CRLF terminiert (so wie Du sie halt eingibst). Eine Variante wär, diese Leerzeichen durch 0h zu ersetzen, dann hast Du gleich die nullterminierten Strings, oder Du kopierst sie in Dein eigenes Programm, mußt halt an entsprechender Stelle Speicherplatz dafür reservieren. Länge des Strings kannst Dir ja schon während dem parsen merken (Register wär wohl vorteilhaft)

    Zitat

    PS: Was für ein Assembler ist das denn eigentlich? Auf was für einer Machine läuft das Programm?


    x86...x86 :winking_face:

    yast, SuSEconfig, apt-get and rpm - the 4 horsemen of the apocalypse

    Platform of insanity :: http://www.dose-xp.org

  • extaler
    2
    extaler
    Mitglied
    Punkte
    15
    Beiträge
    2
    • 22. November 2004 um 23:19
    • #6

    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

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung

  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  • Deutsch
  • English
Zitat speichern