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

  1. DATA        SEGMENT PUBLIC
  2.         EXTRN    PrefixSeg : WORD    ; PSP-Segment
  3. DATA        ENDS
  4. CODE        SEGMENT    PUBLIC
  5.         ASSUME    CS:CODE,DS:DATA
  6.  
  7. EnvString    PROC    FAR
  8.         PUBLIC    EnvString
  9.         push    bp
  10.         cld                ; String-Operationen nach oben
  11.         mov    es,[PrefixSeg]    ; PSP-Segment laden
  12.         mov    es,es:[2Ch]    ; Environment laden
  13.         xor    di,di
  14.         mov    bp,sp        ; Zeiger auf Parameter,
  15.         lds    si,ss:[bp+6]    ; die hinter der Return-Adresse stehen
  16.         ASSUME    DS:NOTHING
  17.         lodsb            ; Länge ermitteln
  18.         or    al,al        ; Null?
  19.         jz    RetNull        ; Falls Null, Rücksprung!
  20.         mov    ah,al        ; Sonst in AH speichern
  21.         mov    dx,si        ; DS:DX enthält erstes Parameterzeichen
  22.         xor    al,al        ; Null!
  23. Vergleich:
  24.         mov    ch,al        ; CH soll Null sein
  25.         mov    si,dx        ; Zeiger auf String
  26.         mov    cl,ah        ; Länge des Strings
  27.         repe    cmpsb        ; Bytes vergleichen
  28.         jne    Sprung        ; Nächsten String suchen
  29.         cmp    BYTE PTR es:[di],'='    ; ok, Nächstes Zeichen '='?
  30.         jne    NichtGefunden    ; Nein, nicht gefunden
  31. Gefunden:
  32.         mov    ax,es    ; DS:SI als Zeiger auf den gefundenen String
  33.         mov    ds,ax
  34.         mov    si,di
  35.         inc    si            ; hinter dem '='-Zeicehn
  36.         les    bx,ss:[bp+10]    ; Adresse des Funktionsergebnisses
  37.         mov    di,bx        ; in ES:DI ablegen
  38.         inc    di            ; Byte mit Länge überspringen
  39.         mov    cl,255        ; Maximale Länge vorgeben
  40. KopierSchleife:
  41.         lodsb            ; Byte holen
  42.         or    al,al        ; Mit Null vergleichen
  43.         jz    Fertig        ; Falls Null, dann sind wir fertig!
  44.         stosb            ; Ins Ergebnis schreiben
  45.         loop    KopierSchleife    ; Bis zu 255 Mal wiederholen
  46. Fertig:
  47.         not    cl            ; Da 255 dekrementiert wurde, enthält
  48.                         ; das Komplement von CL die Länge
  49.         mov    es:[bx],cl        ; Länge speichern
  50.         mov    ax,SEG DATA    
  51.         mov    ds,ax        ; DS wiederherstellen
  52.         ASSUME    ds:DATA
  53.         pop    bp
  54.         ret    4
  55.         ASSUME    ds:NOTHING
  56. Sprung:
  57.         dec    di            ; Ab hier die Null suchen
  58. NichtGefunden:
  59.         mov    cx,07FFFh        ; Falls notwendig, lange suchen
  60.         sub    cx,di        ; Environment immer kleiner als 32K
  61.         jbe    RetNull        ; Falls dahinter, verlassen
  62.         repne    scasb    ; Letzte Null suchen
  63.         jcxz    RetNull        ; Verlassen, falls nicht gefunden
  64.         cmp es:[di],al        ; zweite Null in Folge?
  65.         jne    Vergleich        ; Falls nicht, nochmal versuchen
  66. RetNull:
  67.         les    di,ss:[bp+10]    ; Adresse des Ergebnisses
  68.         stosb            ; Null zurückgeben
  69.         mov    ax,SEG DATA
  70.         mov    ds,ax        ; DS wiederherstellen
  71.         ASSUME    ds:DATA
  72.         pop    bp
  73.         ret    4
  74. EnvString    ENDP
  75. CODE        ENDS
  76.         END
  77.