home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / tasm / chapxmpl.arc / WCOUNT.ASM < prev    next >
Encoding:
Assembly Source File  |  1988-10-09  |  4.0 KB  |  145 lines

  1. ;
  2. ;    Programm zum Zählen der Worte in einer Datei. Die Worte
  3. ;    sind mit einem Leerzeichen, einem Tabulator, CR oder LF
  4. ;    voneinander getrennt.
  5. ;
  6. ;    Verwendung:        wcount < Datei.ext
  7. ;    Anmerkung:            Datei muß mit Control-Z abgeschlossen sein
  8. ;
  9.         DOSSEG
  10.         .MODEL    SMALL
  11.         .STACK    200h
  12.         .DATA
  13. Zaehler            DW    0    ; Zählt die Worte
  14. LeerzeichenFlag        DB    ?    ; auf 1 gesetzt, wenn das letzte
  15.                         ; Zeichen ein Leerzeichen war
  16. TempZeichen        DB    ?    ; Zwischenspeichern für Zeichen
  17. Ergebnis            DB    'Worte zählen: ', 5 DUP (?)
  18.                         ; String für die Ausgabe
  19.                         ; Label für das Stringende
  20. ZaehlerEinfuegenEnde        LABEL    BYTE
  21.                 DB    0Dh,0Ah,'$'
  22.  
  23.         .CODE
  24. ProgrammAnfang:
  25.         mov    ax,@Data
  26.         mov    ds,ax                ; DS zeigt auf Datensegment
  27.         mov    [LeerzeichenFlag],1        ; Leerzeichen annehmen
  28. ZaehlSchleife:
  29.         call    NaechstesZeichenHolen
  30.         jz    EndeZaehlen            ; Falls Ende erreicht
  31.         call    IstEsEinLeerzeichen        ; Nach Leerzeichen suchen
  32.         jz    IstLeerzeichen            ; Ja
  33.         cmp    [LeerzeichenFlag],0        ; Kein Leerzeichen
  34.         jz    ZaehlSchleife            ; Normales Zeichen in Wort
  35.         inc    [Zaehler]                ; Neues Wort gefunden
  36.         mov    [LeerzeichenFlag],0        ; Kein Leerzeichen
  37.         jmp    ZaehlSchleife            ; Nächstes Zeichen
  38. IstLeerzeichen:
  39.         mov    [LeerzeichenFlag],1        ; Leerzeichen vorgeben
  40.         jmp    ZaehlSchleife            ; Nächstes Zeichen
  41. EndeZaehlen:
  42.         mov    ax,[Zaehler]        ; Zahl, die umgewandelt wird
  43.         mov    bx,OFFSET ZaehlerEinfuegenEnde - 1
  44.                             ; Zeiger auf Stringende für Zahl
  45.         mov    cx,5                ; Anzahl der Ziffern
  46.         call    ZahlInStringUmwandeln    ; Zahl umwandeln
  47.         mov    bx,OFFSET Ergebnis    ; Zeiger auf String mit Ergebnis
  48.         call    StringAusgabe        ; String ausgeben
  49.         mov    ah,4Ch            ; DOS-Funktion Programmende
  50.         int    21h                ; Programm beenden
  51. ;
  52. ;    Unterprogramm zum Lesen des nächsten Zeichens vom     
  53. ;    Standardeingabegerät
  54. ;
  55. ;    Eingabewerte:        Keine
  56. ;        
  57. ;    Ausgabewerte:
  58. ;        AL = Zeichen, falls vorhanden
  59. ;        Zero-Flag    = 0 (NZ)    wenn ein Zeichen vorhanden ist
  60. ;                = 1 (Z)    wenn das Dateiende erreicht ist
  61. ;
  62. NaechstesZeichenHolen    PROC
  63.         mov    ah,3Fh            ; DOS-Funktion Datei lesen
  64.         mov    bx,0                ; Standardeingabegerät
  65.         mov    cx,1                ; Ein Zeichen
  66.         mov    dx,OFFSET TempZeichen    ; Einlesen in TempZeichen
  67.         int    21h                ; Zeichen lesen
  68.         jc    KeinZeichenGelesen    ; Falls Fehler dann Dateiende
  69.         cmp    [TempZeichen],1Ah    ; Ctrl-Z abfragen
  70.         jne    KeinControlZ        ; Nein
  71. KeinZeichenGelesen:
  72.         sub    ax,ax            ; Keines gelesen
  73.         and    ax,ax        ; Zero-Flag setzen
  74. KeinControlZ:
  75.         mov    al,[TempZeichen]    ; Zeichen zurückgeben
  76.         ret
  77. NaechstesZeichenHolen    ENDP
  78. ;
  79. ; Unterprogramm zum Prüfen, ob ein Leerzeichen vorliegt
  80. ;
  81. ; Eingabewerte:
  82. ;    AL = Zeichen, das überprüft wird
  83. ;
  84. ; Ausgabewerte:
  85. ;    Zero-Flag     = 0 falls kein Leerzeichen
  86. ;            = 1 falls Leerzeichen
  87. ;
  88. ; Veränderte Register: keine
  89. ;
  90. IstEsEinLeerzeichen    PROC
  91.         cmp    al,' '        ; Leerzeichen?
  92.         jz    EndeLeerzeichenPruefung
  93.         cmp    al,09h        ; TAB?
  94.         jz    EndeLeerzeichenPruefung
  95.         cmp    al,0Dh        ; CR?
  96.         jz    EndeLeerzeichenPruefung
  97.         cmp    al,0Ah        ; LF?
  98. EndeLeerZeichenPruefung:
  99.         ret
  100. IstEsEinLeerZeichen    ENDP
  101. ;
  102. ; Unterprogramm zum Umwandeln einer Binär-zahl in einen String
  103. ;
  104. ; Eingabewerte:
  105. ;    AX = Zahl, die umgewandelt werden soll
  106. ;    DS:BX = Zeiger auf Bereich zum Speichern des Strings
  107. ;    CX = Anzahl der Zeichen
  108. ;
  109. ; Ausgabewerte: keine
  110. ;
  111. ; Veränderte Register: AX, BX, CX, DX, SI
  112. ;
  113. ZahlInStringUmwandeln    PROC
  114.         mov    si,10    ; Teiler durch 10
  115. Umwandeln:
  116.         sub    dx,dx    ; oberes Wort löschen
  117.         div    si        ; Dividieren
  118.         add    dl,'0'    ; Rest in ASCII-Ziffer umwandeln
  119.         mov    [bx],dl    ; speichern
  120.         dec    bx        ; Zeiger auf nächste Ziffer
  121.         loop    Umwandeln
  122.         ret
  123. ZahlInStringUmwandeln    ENDP
  124. ;
  125. ; Unterprogramm für die Ausgabe eines Strings
  126. ;
  127. ; Eingabewerte:
  128. ;    DS:BX = Zeiger auf String, der ausgegeben werden soll
  129. ;
  130. ; Ausgabewerte: keine
  131. ;
  132. ; Veränderte Register: keine
  133. ;
  134. StringAusgabe    PROC
  135.         push    ax        ; AX-Register retten
  136.         push    dx        ; DX-Register retten
  137.         mov    ah,9        ; DOS-Funktion Stringausgabe
  138.         mov    dx,bx    ; Zeiger auf String in DX
  139.         int    21h        ; String ausgeben
  140.         pop    dx        ; DX-Register wiederherstellen
  141.         pop    ax        ; AX-Register wiederherstellen
  142.         ret
  143. StringAusgabe    ENDP
  144.         END    ProgrammAnfang
  145.