Archiv verlassen und diese Seite im Standarddesign anzeigen : Code auslagern
Lord_Otter
23.08.2002, 13:31
Hi !
Ich habe mal versucht, Code in einer Datei auszulagern.
Diese auslagerbaren-Code-Dateien (*.acd) wollte ich dann auf den heap laden und ausführen: Hier mein Code:
procedure Code;
begin
writeln('Ich bin der Code');
end;
procedure Dummy;
begin
end;
var Datei: file;
CodeSize: LongInt;
CodePtr: Pointer;
begin
CodeSize :=Ofs(Dummy)-Ofs(Code);
CodePtr :=@Code;
Assign(Datei,'Code.acd');
ReWrite(Datei,1);
BlockWrite(Datei,CodePtr^,CodeSize);
Close(Datei);
end.
Und der Source meines zweiten Programms:
type
TProc=procedure;
var Datei: file;
CodeSize: LongInt;
CodePtr: TProc;
Buf: Pointer;
begin
Assign(Datei,'Code.acd');
ReSet(Datei,1);
CodeSize :=FileSize(Datei);
GetMem(Buf,CodeSize);
BlockRead(Datei,Buf^,CodeSize);
Close(Datei);
CodePtr :=TProc(Buf);
CodePtr; { Ausgelagerte Routine aufrufen }
FreeMem(Buf,CodeSize);
ReadLn;
end.
Leider hängt sich tp/bp immer auf 1 Kann mir jemand helfen ?
Felix Kaiser
23.08.2002, 14:20
Sowas kannst du ganz und gar vergessen, weil keinerlei Adressen dann mehr passen und ist auch kein Wunder, dass er sich dann aufhängt. Nimm Overlay Dateien, damit haste wenigstens keine Probleme dann!
Lord_Otter
23.08.2002, 18:51
Stimmt. Auf das mit den Addressen hätte ich nun wirklich selbst kommen können.
Ich lass das dann lieber, außerdem gibt es ja DLLs, die man im Protected-Mode auch leicht nutzen kann.
Diogenes
24.08.2002, 16:57
Im Real-Mode (sowas gibt's noch!) kann man DLLs ohnehin vergessen, soviel ich weiß. Dann sind die von FK erwähnten Overlays gefragt.
Lord_Otter
24.08.2002, 17:22
Ich kenn nur Overlay-Units. Meint Felix die ?
Diogenes
24.08.2002, 17:42
Ja
Lord_Otter
25.08.2002, 08:44
Gut.
Lord_Otter
29.08.2002, 20:32
Aber wie ist das dann mit den BGI-Dateien ?
Die kann man einfach auf den Heap hochladen und dann, nachdem man den Grafikmodus initialisert hat, den BGI-Code benutzen.
In diesen Dateien muss man also auch Code auslagern können, oder nicht ?
Wie ist das gemacht oder ist das unbekannt ?
Felix Kaiser
30.08.2002, 12:36
BGI Dateien sind einfach nur mit Assembler erstellte binäre Dateien, die CPU Code u.a. enthalten. Im Source wurde ein Basisoffset für IP definiert und auf ein solches Offset MUSS die BGI Datei geladen werden. Das Format ist von Borland frei erfunden und mir sind über den expliziten Aufbau von BGI Dateien auch keine näher bekannt.
Aber mal ein Beispiel:
var
Code: pointer;
f: file;
Size: integer;
begin
Assign(f,'CODE.BIN');
Reset(f,1);
GetMem(Code,FileSize(f));
BlockRead(f,Code^,FileSize(f));
Size:= FileSize(f);
Close(f);
asm
push ds
call dword ptr Code
pop ds
end;
FreeMem(Code,Size);
end.
mov ax,cs
mov ds,ax
mov dx,offset HelloWorld
moh ah,9
int 21h
retf
HelloWorld db 'Hello, World!',0Dh,0Ah,'$'
Verstehst du das Prinzip?
Lord_Otter
30.08.2002, 16:16
Ja, danke. Also kann ich Code ja doch auslagern.
Felix Kaiser
30.08.2002, 17:27
Ja, wenn du den 'vollständigen' Code, sprich: Assemblersource hast und anpassen kannst. Nein, wenn du Pascal Code meinst, aber: Siehe Overlay.
Das sollte es gewesen sein.
Jan Krüger
30.08.2002, 19:00
code, der nur short jumps (0ebh, 074h etc.) beinhaltet, kann an jede beliebige adresse geladen und ausgeführt werden, aber ich kenne keinen pascal-compiler, der sowas generiert. ;)
und unter normalem DOS ist dynamisches linken leider nicht vorhanden. eine der vielen sachen, die DOS von einem betriebssystem im heutigen sinne unterscheidet (jaja, man kann das auch compilerseitig lösen, aber fast jedes OS hat seinen standard). ;)
Felix Kaiser
30.08.2002, 20:17
Es wären ja nicht mal nur Jumps und Calls, auch Strukturen, Strings, Variablen und all der Kram der verwaltet wird.
Jan Krüger
30.08.2002, 20:39
schlauer (assembler-)code kann das alles dynamisch allokieren ;)
Felix Kaiser
30.08.2002, 20:56
Joa, aber es geht um Pascalcode und der isses nich :D Kenne ja die meisten strukturiellen Klauseln, oft genug debuggt ;)
Lord_Otter
30.08.2002, 22:08
Ich kann den Code in Assembler programmieren, kein Problem (oder zumindest kein großes), da ich Routinen, wo ich das gebrauchen könnte, eh in Assembler schreiben würde.
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.