function MakeProcInstance(M: TMethod): Pointer;
begin
// Ausführbaren Speicher alloziieren
Result := VirtualAlloc(
nil, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
asm
// POP EDX (bisherige Rücksprungadresse nach edx)
MOV BYTE PTR [EAX], $5A
// CALL +0 (aktuelle Addresse ermitteln)
MOV BYTE PTR [EAX+$01], $E8
MOV DWORD PTR [EAX+$02], $00000000
// POP ECX (Addresse nach ECX)
MOV BYTE PTR [EAX+$06], $59
// ADD ECX, $31 (Addresse von Liste errechnen)
MOV BYTE PTR [EAX+$07], $83
MOV BYTE PTR [EAX+$08], $C1
MOV BYTE PTR [EAX+$09], $31
// MOV EAX, [ECX] (Listenindex nach EAX)
MOV BYTE PTR [EAX+$0A], $8B
MOV BYTE PTR [EAX+$0B], $01
// INC EAX (Listenindex erhöhen)
MOV BYTE PTR [EAX+$0C], $40
// MOV [ECX+EAX*4], EDX (Rücksprungaddresse in Liste eintragen)
MOV BYTE PTR [EAX+$0D], $89
MOV BYTE PTR [EAX+$0E], $14
MOV BYTE PTR [EAX+$0F], $81
// MOV [ECX], EAX (Index speichern)
MOV BYTE PTR [EAX+$10], $89
MOV BYTE PTR [EAX+$11], $01
// MOV ECX, (Self nach ECX)
MOV BYTE PTR [EAX+$12], $B9
MOV ECX, M.Data
MOV DWORD PTR [EAX+$13], ECX
// PUSH ECX (self als Parameter 0 anfügen)
MOV BYTE PTR [EAX+$17], $51
// MOV ECX, (Addresse nach ecx laden)
MOV BYTE PTR [EAX+$18], $B9
MOV ECX, M.Code
MOV DWORD PTR [EAX+$19], ECX
// CALL ECX (Sprung an den ersten abgelegten Befehl und Methode aufrufen)
MOV BYTE PTR [EAX+$1D], $FF
MOV BYTE PTR [EAX+$1E], $D1
// POP ECX (Self vom Stack löschen)
MOV BYTE PTR [EAX+$1F], $59
// CALL +0 (aktuelle Addresse ermitteln)
MOV BYTE PTR [EAX+$20], $E8
MOV DWORD PTR [EAX+$21], $00000000
// POP ECX (aktuelle Addresse nach ECX)
MOV BYTE PTR [EAX+$25], $59
// ADD ECX, $12 (Addresse von Liste errechnen)
MOV BYTE PTR [EAX+$26], $83
MOV BYTE PTR [EAX+$27], $C1
MOV BYTE PTR [EAX+$28], $12
// MOV EDX, [ECX] (Listenindex nach EDX)
MOV BYTE PTR [EAX+$29], $8B
MOV BYTE PTR [EAX+$2A], $11
// PUSH EAX (Funktionsresult retten)
MOV BYTE PTR [EAX+$2B], $50
// MOV EAX, [ECX+EDX*4] (Rücksprungaddresse nach EAX)
MOV BYTE PTR [EAX+$2C], $8B
MOV BYTE PTR [EAX+$2D], $04
MOV BYTE PTR [EAX+$2E], $91
// DEC EDX (Listenindex dekrementieren)
MOV BYTE PTR [EAX+$2F], $4A
// MOV [ECX], EDX (Listenindex speichern)
MOV BYTE PTR [EAX+$30], $89
MOV BYTE PTR [EAX+$31], $11
// POP EDX (Funktionsresult nach EDX)
MOV BYTE PTR [EAX+$32], $5A
// PUSH EAX (Rücksprungadresse auf Stack)
MOV BYTE PTR [EAX+$33], $50
// MOV EAX, EDX (Funktionsresult zurück nach EAX)
MOV BYTE PTR [EAX+$34], $89
MOV BYTE PTR [EAX+$35], $D0
// RET (End;)
MOV BYTE PTR [EAX+$36], $C3
// DD 0 (Anfang der Liste mit Index=0)
MOV DWORD PTR [EAX+$37], $00000000
end;
end;