function MakeProcInstance(M: TMethod): Pointer;
begin
// Ausführbaren Speicher alloziieren
Result := VirtualAlloc(
nil, $27, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
asm
// POP EDX (bisherige Rücksprungadresse nach edx)
MOV BYTE PTR [EAX], $5A
// CALL +4 (4 Bytes Platz für Speicherung der Rücksprungaddresse)
MOV BYTE PTR [EAX+$01], $E8
MOV BYTE PTR [EAX+$02], $04
MOV BYTE PTR [EAX+$03], $00
MOV BYTE PTR [EAX+$04], $00
MOV BYTE PTR [EAX+$05], $00
// DD 0
MOV DWORD PTR [EAX+$06], $00000000
// POP ECX (Addresse vonn "DD 0" nach ECX)
MOV BYTE PTR [EAX+$0A], $59
// MOV [ECX], EDX (Rücksprungaddresse bei "DD 0" speichern)
MOV BYTE PTR [EAX+$0B], $89
MOV BYTE PTR [EAX+$0C], $11
// MOV ECX, (Self nach ECX)
MOV BYTE PTR [EAX+$0D], $B9
MOV ECX, M.Data
MOV DWORD PTR [EAX+$0E], ECX
// PUSH ECX (self als Parameter 0 anfügen)
MOV BYTE PTR [EAX+$12], $51
// MOV ECX, (Adresse nach ecx laden)
MOV BYTE PTR [EAX+$13], $B9
MOV ECX, M.Code
MOV DWORD PTR [EAX+$14], ECX
// CALL ECX (Sprung an den ersten abgelegten Befehl und Methode aufrufen)
MOV BYTE PTR [EAX+$18], $FF
MOV BYTE PTR [EAX+$19], $D1
// POP ECX (Self vom Stack löschen)
MOV BYTE PTR [EAX+$1A], $59
// CALL +0 (aktuelle Addresse ermitteln)
MOV BYTE PTR [EAX+$1B], $E8
MOV DWORD PTR [EAX+$1C], $00000000
// POP ECX (aktuelle Addresse nach ECX)
MOV BYTE PTR [EAX+$20], $59
// ADD ECX, -19 (Addresse von "DD 0" errechnen)
MOV BYTE PTR [EAX+$21], $83
MOV BYTE PTR [EAX+$22], $C1
MOV BYTE PTR [EAX+$23], $E6
// MOV EDX, [ECX] (Rücksprungadresse von "DD 0" nach EDX)
MOV BYTE PTR [EAX+$24], $8B
MOV BYTE PTR [EAX+$25], $11
// PUSH EDX (Rücksprungadresse zurück auf den Stack)
MOV BYTE PTR [EAX+$26], $52
//RET
MOV BYTE PTR [EAX+$27], $C3
end;
end;