Environment freigeben


Standort: Alexander Foken > Projekte > DOS > Environment freigeben


In Assembler, COM-Programm

FreeMyEnv:     mov  es,cs:[002Ch]    ; ES auf's Environment
               mov  ah,49h           ; DOS: Free Memory Block in ES
               int  21h
               jnc  @@FreeOK
               ;
               ; Es hat nicht geklappt:
               ;  AX=7 -> Speicherverwaltung zerstört
               ;  AX=9 -> Ungültiger Block - schon freigegeben ?
               ;
 @@FreeOK:     ; alles klar, weiter geht's

In Assembler, EXE-Programm

PrefixSeg      dw   ?
ExeStart:      ; ggf. DS initialisieren
               ;
               mov  PrefixSeg,es     ; PSP sichern
               ;
               ; weitere Initialisierungen
FreeMyEnv:     mov  es,PrefixSeg     ; ES auf's PSP, um Environment zu finden
               mov  es,es:[002Ch]    ; ES auf's Environment
               mov  ah,49h           ; DOS: Free Memory Block in ES
               int  21h
               jnc  @@FreeOK
               ;
               ; Es hat nicht geklappt:
               ;  AX=7 -> Speicherverwaltung zerstört
               ;  AX=9 -> Ungültiger Block - schon freigegeben ?
               ;
 @@FreeOK:     ; alles klar, weiter geht's

In Borland/Turbo Pascal 7

function FreeMyEnv : word; assembler; { 0 = ok, sonst Fehlercode }
 asm
               mov  es,PrefixSeg     { in Unit System definiert und initialisiert }
               mov  es,es:[002Ch]    { ES auf's Environment }
               mov  ah,49h           { DOS: Free Memory Block in ES }
               int  21h
               jc   @@ende
               xor  ax,ax
  @@ende:
 end;

In Turbo Pascal 6

function FreeMyEnv : word; inline (
  $8E/$06/PrefixSeg/    {         mov es,PrefixSeg  ; in Unit System definiert und initialisiert }
  $26/$8E/$06/$2C/$00/  {         mov es,es:[002Ch] ; ES auf's Environment }
  $B4/$49/              {         mov ah,49h        ; DOS: Free Memory Block in ES }
  $CD/$21/              {         int 21h }
  $72/$02/              {         jc @@ende }
  $31/$C0);             {         xor ax,ax }
                        { @@ende: }

In Pseudo-Code

  1. PSP(Programm Segment Prefix)-Segment ermitteln
  2. Wert aus PSP-Segment, Offset 2C(hex)=44(dez) in Register ES kopieren
  3. Register AH mit 49(hex)=73(dez) laden, alternativ dazu das Register AX mit 4900(hex)=18688(dez) laden.
  4. Interrupt 21(hex)=33(dez) aufrufen
  5. Wenn das Carry-Flag gesetzt ist, ist ein Fehler aufgetreten, der Fehlercode steht im AX-Register