PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Heap-Speicher allozieren


Lord_Otter
21.08.2002, 17:05
Moin !
Ich programmiere oft Assembler-Routinen in Pascal und C++, aber manchmal muss ich auch Heap-Speicher allozieren.
In C++ mach ich das z:b. mit malloc, in Pascal mit New oder GetMem, aber wie geht das in Assembler ?
Ich möchte diese Routinen auch in Assembler programmieren können. Geht das vielleicht mit dem Dos-Interrupt ? Und wie kann ich den Speicher wieder freigeben ?


Jan Krüger
21.08.2002, 17:06
erstmal solltest du der allgemeinheit vielleicht verraten, für welches betriebssystem du programmieren willst (win32, dos, unix, ...)? :)

DOS: int 21h, subfunktion 48h.
win32: API-call HeapAlloc (glaub ich zumindest ;))
unix: keine ahnung :)

Lord_Otter
21.08.2002, 17:07
DOS

Felix Kaiser
21.08.2002, 17:10
Siehe DOS Funktionen AH=48h, 49h und 4Ah. Damit allozierst du DOS Speicher. Allerdings darf der Bereich oberhalb der Anwendung nicht ausschließlich für deine Anwendung reserviert sein. Der Turbo Linker von Borland z.B. reserviert immer 1M für das Programm, womit diese Funktionen praktisch flach fallen. Man kann sich allerdings auch selbst Routinen basteln, wenn man weiß, dass der Speicher oberhalb der Anwendung bis 640k für den Programmheap genutzt werden kann. Pascal alloziert in dem für die Anwendung reservierten Speicher Heapblöcke und verwaltet diese.

Jan Krüger
21.08.2002, 17:13
solltest du noch mehr speicher brauchen, musst du calls zu himem.sys (int 2fh, subfunktion 43h) / emm386 (find ich gerade keine doku zu) benutzen.

Lord_Otter
21.08.2002, 17:13
Wo soll ich das sehen ?
Wie werden diese gehandhabt ?

Lord_Otter
21.08.2002, 17:14
Danke, JaST !
Ist ja wie im Chat hier...
Vielleicht findet ja jemand noch ne Doku...

Jan Krüger
21.08.2002, 17:16
ich habe irgendwo auf der festplatte eine referenz für spieleprogrammierer rumliegen, da sind lauter so sachen dokumentiert. wenn ich sie finde, lade ich sie mal hoch.

PS. der chat selber ist eindeutig auch zu empfehlen :)

Felix Kaiser
21.08.2002, 17:24
Man muss sehr stark differenzieren: RealMode und ProtectedMode. XMS und EMS Speichermanager können den Arbeitsspeicher der RealMode Anwendung NICHT als Heap zur Verfügung stellen, eher nur als Auslagerungsspeicher, da direkter Zugriff in dem Sinne nicht möglich ist.

Wenn man pfiffig ist, könnte man das ganze einwenig mit Pascal untermauern und eine 16-Bit ProtectedMode Anwendung erschaffen, du weißt ja sicher wie gut Assemblersourcen in Pascal Anwendung finden könnten. Kannst dann problemlos die DPMI Funktionen benutzen und über auf Selektoren verteilte Speicherblöcke problemlos einen Heap bis 64M benutzen.

Jan Krüger
21.08.2002, 17:27
es gibt einen "bug" in der prozessorarchitektur seit dem 80386er, der es ermöglicht, auf den gesamten speicherbereich des computers aus dem real mode zuzugreifen, wenn man in den protected mode wechselt, ein paar sachen umändert (wenn ich mich richtig erinnere, GS auf einen selektor über den gesamten adressraum setzen) und wieder in den real mode zurückschaltet.
ich weiß allerdings nicht, ob sich das mit den DOS calls und mit den libs von pascal oder was auch immer verträgt.

PS. besagte doku finde ich leider nicht mehr.

Felix Kaiser
21.08.2002, 17:30
Der Bug ist mir bekannt, soweit ich weiß kann man einen Selektor auf 4G mappen und diesen dann im RealMode auch weiterbenutzen. Allerdings gabs den Bug afair auch nicht auf allen Modellen, sondern nur eine gewisse Zeit lang, bis er aufflog. Zu dem kann man ihn vergessen, wenn Speichermanager im Spiel sind.

Lord_Schubach
21.08.2002, 19:53
Das ist ja wirklich ein Chat.

Lord_Otter
21.08.2002, 21:12
So schnelle und auch gute Antworten. Vielen Dank. Diese Referenz interressiert mich ganz besonders, JaST. Ich hoffe, du findest sie bald.

Baegsch
28.08.2002, 16:16
Zur Vollständigkeit:

unter BSD4.3 konformen Systemen wird der syscall brk angeboten, auf den malloc intern auch zurückgreift (afaik).

Lord_Otter
28.08.2002, 16:28
Danke.

Nukacola
02.09.2002, 22:00
Also unter Windows 95/98 glaub ich geht das mit VxD Calls â la

vxdcall macro vxd_id, service_id
int 20h
dw service_id
dw vxd_id
endm

dann sollte vxd_id=0040h und sevice_id=000dh , außerdem muß der benötigten Speicher auf den Stack gepushed werden. Nachdem Aufruf sollte eax die Adresse und der Stack die Göße des zu reservierenden Speicher enthalten.

leider kann man vxd calls nur mit Ring0 Priorität ausführen...
aber auch da bietet win95/98 so einige möglichkeiten....:mauer:

Lord_Otter
03.09.2002, 09:44
Danke, ich werde das mal ausprobieren.