home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / tasm / chapxmpl.arc / MULT_C&D.ASM < prev    next >
Encoding:
Assembly Source File  |  1988-10-10  |  3.7 KB  |  150 lines

  1. ;
  2. ; Programm, um zu zeigen, wie man mehrere Code- und Datensegmente
  3. ; in einem Programm verwalten kann.
  4. ;
  5. ; Liest einen String, speichert ihn dann in einem Datensegment,
  6. ; kopiert ihn dann in ein anderes Datensegment, wobei Großbuch-
  7. ; staben in Kleinbuchstaben umgewandelt werden. Anschließend wird
  8. ; der String wieder auf der Konsole ausgegeben.
  9. ; Zum Lesen, Ausgeben und Kopieren des Strings werden Funktionen
  10. ; in anderen Segmenten aufgerufen.
  11. ;
  12. StackSeg        SEGMENT    PARA STACK 'STACK'
  13.         DB    512 DUP (?)
  14. StackSeg        ENDS
  15.  
  16. MAX_STRING    EQU    1000
  17.  
  18. QuellDatenSeg    SEGMENT    PARA PRIVATE 'DATA'
  19. EingabePuffer    DB    MAX_STRING DUP (?)
  20. QuellDatenSeg    ENDS
  21.  
  22. ZielDatenSeg    SEGMENT    PARA PRIVATE 'DATA'
  23. AusgabePuffer    DB    MAX_STRING DUP (?)
  24. ZielDatenSeg    ENDS
  25.  
  26. UPSeg        SEGMENT    PARA PRIVATE 'CODE'
  27.         ASSUME    cs:UPSeg
  28. ; Unterprogramm zum Einlesen eines Strings von der Konsole. Das Ende
  29. ; des Strings wird mit dem Zeichen CR gekennzeichnet, das anschließend
  30. ; in ein CR/LF-Paar umgewandelt wird, damit bei der Ausgabe unter MS-DOS
  31. ; ein Zeilenvorschub ausgeführt wird. Der String wird mit NUL abgeschlos-
  32. ; sen.
  33. ;
  34. ; Eingabewerte:
  35. ;    ES:DI -     Zeiger auf Speicherbereich, in den der String 
  36. ;            kopiert werden soll.
  37. ;
  38. ; Ausgabewerte:        Keine
  39. ;
  40. ; Veränderte Register:    AX, DI
  41. ;
  42. StringLesen    PROC    FAR
  43. StringLesenSchleife:
  44.         mov    ah,1
  45.         int    21h                    ; nächstes Zeichen lesen
  46.         stosb                    ; speichern
  47.         cmp    al,13                ; CR ?
  48.         jnz    StringLesenSchleife
  49.         mov    BYTE PTR es:[di],10        ; String mit LF
  50.         mov    BYTE PTR es:[di+1],0        ; und NUL abschließen
  51.         ret
  52. StringLesen    ENDP
  53. ;
  54. ; Unterprogramm zum Kopieren eines Strings, der dabei in
  55. ; Kleinbuchstaben umgewandelt wird
  56. ;
  57. ; Eingabewerte:
  58. ;    DS:SI - String, der kopiert wird
  59. ;    ES:DI - Stelle, wohin der String kopiert wird
  60. ;
  61. ; Ausgabewerte: Keine
  62. ;
  63. ; Veränderte Register: AL, SI, DI
  64. ;
  65. KopieInKleinbuchstaben    PROC    FAR
  66. KopierSchleife:
  67.         lodsb
  68.         cmp    al,'A'
  69.         jb    KeinGrossbuchstabe
  70.         cmp    al,'Z'
  71.         ja    KeinGrossbuchstabe
  72.         add    al,20h            ; in Kleinbuchstaben umwandeln
  73. KeinGrossBuchstabe:
  74.         stosb
  75.         and    al,al            ; NUL am Ende ?
  76.         jnz    KopierSchleife        ; Nein, nächstes Zeichen
  77.         ret
  78. KopieInKleinbuchstaben    ENDP
  79. ;
  80. ; Unterprogramm für die Ausgabe eines Strings
  81. ;
  82. ; Eingabewerte:
  83. ;    DS:SI - Zeiger auf String, er ausgegeben werden soll
  84. ;
  85. ; Ausgabewerte: Keine
  86. ;
  87. ; Veränderte Register: AH, DL, SI
  88. ;
  89. StringAusgabe    PROC    FAR
  90. StringAusgabeSchleife:
  91.         mov    dl,[si]            ; Zeichen holen
  92.         and    dl,dl            ; NUL-Zeichen ?
  93.         jz    StringAusgabeFertig    ; ja, fertig
  94.         inc    si                ; Zeiger auf das nächste Zeichen
  95.         mov    ah,2
  96.         int    21h                ; Zeichen ausgeben
  97.         jmp    StringAusgabeSchleife
  98. StringAusgabeFertig:
  99.         ret
  100. StringAusgabe    ENDP
  101. UPSeg        ENDS
  102.  
  103. Code        SEGMENT    PARA PRIVATE 'CODE'
  104.         ASSUME    cs:Code,ds:NOTHING,es:NOTHING,SS:StackSeg
  105. ProgrammAnfang:
  106.         cld                ; Stringzeiger werden inkrementiert
  107. ;
  108. ; String von der Konsole in Eingabepuffer lesen
  109. ;
  110.         mov    ax,QuellDatenSeg
  111.         mov    es,ax
  112.         ASSUME    es:QuellDatenSeg
  113.         mov    di,OFFSET EingabePuffer
  114.         call    StringLesen    ; String von Konsole lesen und unter
  115.                         ; ES:DI speichern
  116. ;
  117. ; Zeilenvorschub in die nächste Zeile
  118. ;
  119.         mov    ah,2
  120.         mov    dl,10
  121.         int    21h
  122. ;
  123. ; String vom EingabePuffer auf den AusgabePuffer kopieren
  124. ; Gleichzeitig Umwandlung in Kleinbuchstaben
  125. ;
  126.         push    es
  127.         pop    ds
  128.         ASSUME    ds:QuellDatenSeg
  129.         mov    ax,ZielDatenSeg
  130.         mov    es,ax
  131.         ASSUME    es:ZielDatenSeg
  132.         mov    si,OFFSET EingabePuffer    ; Kopie von DS:SI
  133.         mov    di,OFFSET AusgabePuffer    ; nach ES:DI und
  134.         call    KopieInKleinbuchstaben    ; in Kleinbuchstaben umwandeln
  135. ;
  136. ; String in Kleinbuchstaben ausgeben
  137. ;
  138.         push    es
  139.         pop    ds
  140.         ASSUME    ds:ZielDatenSeg
  141.         mov    si,OFFSET AusgabePuffer
  142.         call    StringAusgabe            ; String in DS:SI ausgeben
  143. ;
  144. ; Fertig.
  145. ;
  146.         mov    ah,4Ch
  147.         int    21h
  148. Code        ENDS
  149.         END    ProgrammAnfang
  150.