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

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