Contributor: KAI ROHRBACHER 
{
KAI ROHRBACHER
I'm looking For a way to tell BorlandPascal that an allocated _data_
block should now be treated as an executable routine (in Protected Mode).
Here is a little example to show the problem; it runs w/o problems in
Real Mode, but results in a GP-fault (despite the use of the alias-selector!):
}
Program SelfModify;
Const
 AnzNOPs = 10;
Type
 TTestProc = Procedure;
Var
 code : Pointer;
 Run : TTestProc;
 pb : ^Byte;
 pw : ^Word Absolute pb;
 i : LongInt;
begin
 GetMem(code, AnzNOPs + 7); {7 Bytes For proc header & end}
 pb := code; {pb = ^start of routine to build}
 pb^ := 55ドル;
 INC(pb); {push bp}
 pw^ := $E589;
 INC(pw); {mov bp,sp}
 For i := 1 to AnzNOPs DO
 begin
 pb^ := 90ドル;
 INC(pb); {nop's}
 end;
 pb^ := 5ドルD;
 INC(pb); {pop bp}
 pb^ := $CA;
 INC(pb);
 pw^ := 0000ドル; {retf 0}
 {$IFDEF DPMI}
 WriteLN('Protected Mode');
 code:= Ptr(Seg(code) + SelectorInc, Ofs(code)); {alias-selector}
 {$else}
 WriteLN('Real Mode');
 {$endIF}
 Run := TTestProc(code); {that's a Type-cast!}
 Run; {call routine}
 FreeMem(code, AnzNOPs + 7);
 WriteLN('Alive and kicking!');
end.
 

AltStyle によって変換されたページ (->オリジナル) /