# Assembler Speicher reservieren (und diesen erweitern)



## xerses (21. März 2005)

Hi leutz..

ich bin gerade dabei n bischen grafischen kram in assembler zu programmieren. ich habe mir ganz fein ein ganzes segment mit 48h und int21h für den bildschirm reserviert auf dem dann immer gearbeitet wird. 
nun brauche ich noch n zusätzliches feld. dieses soll eine art array darstellen und sollte wenn möglich dynamisch gehalten werden. ich weiß nun das man mit 48h speicher reservieren und mit 49h wieder frei geben kann. aber gibt es auch eine möglichkeit schon reservierten speicher zu erweitern wie gesagt, das soll ne art dynamischer array werden. 
gibt es da evtl. 50h oder so zum nachträglichen vergrößern ;-) 
ich hab schon bei google gesucht, aber leider ergebnislos. :-(

wäre für jeden tip dankbar 

gruß && thx

xerses


----------



## xerses (30. März 2005)

Hi..

Nun hab ich es selbst heraus gefunden. Zwar mehr mit Glück als Verstand, aber ich habe es raus.  Das dumme ist nur, das wenn ich nun den Speicherblock mit 

AX = 4A00h
INT 21h

um einen Paragraphen erweitern will, funktioniert es nur am Anfang. So schätzungsweise die ersten 8-12 mal. Danach ist das Carry-Flag gesetzt und AX hat den Wert 8. In BX steht, dann ja wieviel Paragraphen überhaupt möglich sind. Ich will, damit ja einen dynamischen Array abbilden und dieser kann dann auch schon mal so seine 2000 Word Elemente haben. 
Meine Frage ist nun, wieso kann ich das nur 2 - 3 mal um jeweils einen Paragraphen erweitern? Kann es daran liegen, das ich schon ein ganzes Segment (64kb) vorher reserviert habe? Wenn ja, wie kann ich das zu umgehen? Ich will im Endeffekt zwei "dynamische Arrays" und einen 64kB großen statischen Block im Speicher halten.

Gruß && Dank

Xersés

PS: Bitte nicht mit Pascal ankommen, wo es einen dynamischen Array geht.  Ich bin "gewzungen" das ganze in Assembler zu programmieren.  thx


----------



## stephsto (31. März 2005)

Hallo,

also ich würd jetzt einfach mal sagen, deine Adresse, die du ansprichst wird zu groß. Wenn in ax 8 steht und das Carry Flag gesetzt ist wurde halt zu der Adresse in ax ein Wert addiert der zu einem Überlauf führte.


----------



## xerses (3. April 2005)

Hallo..
Sorry, war aber das ganze Wochenende unterwegs und hab erst eben deine Antwort gelesen. Die Idee mit dem Überlauf hatte ich auch schon, aber der Fehler tritt schon nach ein bis zwei Schleifendurchläufen auf. In BX steht die Anzahl in Paragraphen (immer 4, also 4 mal 16Byte) und nach dem Aufruf steht in BX eine 3. Das sind so kleine Zahlen das ich nicht glaube, das da ein Überlauf entsteht. Zudem steht in der Hilfe, das wenn das Carry-Flag gesetzt ist und AX den Wert 8 enthält, dass er dann keinen weiteren Platz reservieren kann.
Wenn ich allerdings nun, von anfang an mir beispielsweise 5Paragraphen reserviere geht das. Es ist auch möglich drei mal 64k zu reservieren. Es kommt aber die Meldung das er nicht mehr reservieren kann, wenn der schon bereits reservierte Block vergrößert werden soll. Aber wenn keiner so richtig weiß woran das liegen kann, werde ich mir wohl von Anfang an so viel Platz reservieren, wie maximal benötigt wird. :-(

Finde ich zwar als Lösung ziemlich blöd, weil man so viel zu viel Speicher auf einmal reserviert, aber ohne Hilfe komm ich da halt leider nicht weiter. :'-(

gruß && thx

xerses


----------

