amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Der Stack gehört mir! (?) [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- 2 [ - Beitrag schreiben - ]

06.07.2010, 11:51 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Eine Frage an die Experten:

Darf ich mit dem Stack machen was ich will?

d.h. ihn als Heap ansehen und überall Daten speichern, oder ist es nur erlaubt ihn im Stack Stil zu nutzen, und Daten sind nur gültig oberhalb des Stack Pointer?

Konkret: Darf ich Daten an den Anfang des Stacks legen, in der hoffnung dass der Stack nicht so gross wird dass diese Überschrieben werden?

Wie würde OS4 darauf reagieren?

--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

06.07.2010, 12:27 Uhr

DrNOP
Posts: 4118
Nutzer
Ich bin noch etwas verwirrt ... ich glaube nicht, daß ich verstanden habe, was du willst.

Deshalb erst mal so viel:
Der Stack gehört nicht dir, sondern deinem Compiler. Der organisiert dort lokale Variablen so, wie's ihm paßt. Wenn du mehr Stack benutzen willst, leg' mehr lokale Variablen an.

Ich verstehe nicht, wie du vorhast Daten an eine bestimmte Stelle im Stack zu legen, da du a) nicht weißt wo im Speicher der betreffende Stack liegt und b) du keinen malloc auf einen Stack machen kannst.

Und zum Schluß:
Treffen sich Stack und Heap, macht es Beep. Beantwortet das deine Frage? ;)
--
Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker

[ - Antworten - Zitieren - Direktlink - ]

06.07.2010, 13:11 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Ok, nehmen wir mal an ich bin Assembler Programmierer. Und kann mir den Speicherblock besorgen aus der Task struct. Ich weis also wo beim Stack liegt.

Der Hintergrund ist, ich muss mir ein paar Bytes merken (gerettete Register). Der Code muss re-entrant sein. Ich kann das also nicht einfach hierhinlegen:

mySpace: Ds.l n

da dass bei jedem Thread durch die gleichen Speicherzellen representiert wird. Wohin also, wenn nicht auf den Stack?
Allerdings muss ich von überall darauf zugreifen können, egal was sonst noch so auf dem Stack gerade los ist. Ich brauche also eine feste Adresse.

--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

06.07.2010, 13:41 Uhr

thomas
Posts: 7718
Nutzer
@Der_Wanderer:

Üblicherweise allokiert man am Programmanfang den Speicher für globale Variablen und hält dann während des Programmlaufs die Adresse ständig in einem Basisregister (z.B. A4).

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

06.07.2010, 13:48 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@thomas
Ich habe keinen Register zur Verfügung. Leider.

@moderator
Könnt ihr Bernd Roesch entsperren?
--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

06.07.2010, 14:03 Uhr

DrNOP
Posts: 4118
Nutzer
@Der_Wanderer:
Ah, Assembler, sag das doch gleich! Muß das sein!? :P

Ein System mit Speicherschutz würde dir auf die Finger hauen, wenn du von einem Thread aus auf Speicher eines anderen zugreifen willst, das weißt du?

Wieso mußt du überhaupt von jeder Instanz aus wissen, was alle anderen an Registern gerettet haben?

Um das sauber zu machen müßte eine Instanz die andere nach den entsprechenden Daten fragen. So kann jede Instanz ihre Daten lokal behalten, ohne daß die jeweils anderen deren Adresse kennen muß und es nur einen Datensatz geben kann.

--
Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker

[ - Antworten - Zitieren - Direktlink - ]

06.07.2010, 14:27 Uhr

Thore
Posts: 2266
Nutzer
Du kannst einen eigenen Stack machen, reservier Speicher in der gewünschten Größe, und halte einen Stackpointer parat, der auf den aktuellen Eintrag zeigt.
Programmierst du in PPC oder 68k? (Muss man ja heutzutage nachfragen ;) )

[ - Antworten - Zitieren - Direktlink - ]

06.07.2010, 14:46 Uhr

Der_Wanderer
Posts: 1229
Nutzer
68K.

Die Threads müssen nicht untereinander auf den Stack zugreifen. Nur jeder auf seinen eigenen.
Aber jeder Thread hat logischerweise andere Inhalte in den Registern die er retten muss, darum geht es nicht über eine Speicherzelle in der Exe.

Sprich jeder Thread der mit diesem Code aufgemacht wird, muss eigene Register Retten. Normalerweise würde man sie oben auf den Stack drauf schmeissen.
Aber diese Register werden manchmal benötigt, wenn der Stack nicht exakt bis auf dieses Level abgearbeitet wurde.

--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

06.07.2010, 14:56 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Der_Wanderer:
Konkret: Darf ich Daten an den Anfang des Stacks legen, in der hoffnung dass der Stack nicht so gross wird dass diese Überschrieben werden?

Ich denke, die Frage kannst Du Dir selber beantworten. Zu hoffen, dass irgendetwas schon nicht passieren wird, ist definitiv der falsche Ansatz.

Zitat:
Wie würde OS4 darauf reagieren?
Nicht anders als jedes andere Betriebssystem. Es wird Deine Daten gnadenlos überschreiben, sobald der Stack den Platz braucht.
Falls Dir das an Problemen nicht reicht, zukünftige OS-Versionen könnten vielleicht eine automatische Stack-Vergrößerung bekommen, die bereits aktiv wird, wenn in das letze Segment geschrieben wird, d.h. neben der Verschwendung von Speicher würde auch der "Anfang" des Stacks sich dann woanders befinden, womit Du Deine abgelegten Daten nicht mehr findest.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

06.07.2010, 15:06 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Der_Wanderer:
@thomas
Ich habe keinen Register zur Verfügung. Leider.

Kann gar nicht sein. Wenn Du die Daten wirklich brauchst, dann wirst Du auch ein Register dafür frei machen können. Im Notfall packst Du eben einen Wert mehr auf den Stack...
Zitat:
Original von Der_Wanderer:
Sprich jeder Thread der mit diesem Code aufgemacht wird, muss eigene Register Retten. Normalerweise würde man sie oben auf den Stack drauf schmeissen.
Aber diese Register werden manchmal benötigt, wenn der Stack nicht exakt bis auf dieses Level abgearbeitet wurde.

Je nachdem, wie Dein Code strukturiert ist, lässt sich für jede Codestelle der Offset zu so einer Speicherstelle auf dem Stack vorhersagen, womit auch der Zugriff auf diese Daten möglich ist. Die Vorgehensweise der meisten Programmiersprachen mit einem zusätzlichen Register vereinfacht die Sache natürlich, und ist unumgänglich, wenn eine Funktion mehrmals mit unterschiedlichen Stack-Tiefen aufgerufen wird.

Ansonsten hat jeder Task auch einen tc_UserData Pointer zu freien Verwendung...

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

06.07.2010, 15:22 Uhr

Der_Wanderer
Posts: 1229
Nutzer
> Ansonsten hat jeder Task auch einen tc_UserData Pointer zu freien Verwendung...
Das könnte der Schlüssel zur Lösung sein.

Der Grund warum ich keine Register zur Verfügung habe ist, dass ich innerhalb eines bestehenden Programmes den Context switchen muss. Ich kann nicht vorhersagen, das der übrige Code mit den Registern tut.

--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

06.07.2010, 16:32 Uhr

DrNOP
Posts: 4118
Nutzer
Zitat:
Original von Der_Wanderer:
Die Threads müssen nicht untereinander auf den Stack zugreifen. Nur jeder auf seinen eigenen.

Äh?
Zitat:
Original von Der_Wanderer, Heute, 13:11 Uhr:
Allerdings muss ich von überall darauf zugreifen können, egal was sonst noch so auf dem Stack gerade los ist. Ich brauche also eine feste Adresse.

Du schaffst es immer wieder, mich zu verwirren!

Zitat:
Original von Der_Wanderer:
Sprich jeder Thread der mit diesem Code aufgemacht wird, muss eigene Register Retten. Normalerweise würde man sie oben auf den Stack drauf schmeissen.

Dann allokier dir einen Speicher, und wirf die Daten dort hinein.

Und es kann nicht sein daß du keine Register zur Verfügung hast, sonst würde dein Programm nicht laufen. Und wenn jedes Programm die Register wie Kraut und Rüben zurücklassen würde, hätte Multitaksing noch nie funktioniert.
--
Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker

[ - Antworten - Zitieren - Direktlink - ]

06.07.2010, 17:10 Uhr

thomas
Posts: 7718
Nutzer
Zitat:
Original von DrNOP:

Du schaffst es immer wieder, mich zu verwirren!


Er will globale Variablen in einem reentrant-fähigen Programm benutzen. Was ist da so schwer dran zu verstehen?



Zitat:
Und wenn jedes Programm die Register wie Kraut und Rüben zurücklassen würde, hätte Multitaksing noch nie funktioniert.

Wann hast du Multitasking gelernt? In der 50ern?

Unter AmigaOS haben Programme keine Kontrolle darüber, wann sie den Prozessor abgeben müssen und können dementsprechend die Register gar nicht definiert setzen. Jedes Programm kann mit seinen Registern machen, was es will. Das einzige Register, das bei Programmende (und nicht vorher) definiert gesetzt werden muß, ist D0, denn es enthält den Return-Code.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

06.07.2010, 18:05 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@DrNOP
Ich habe nie gesagt dass die Threads sich gegenseitig in den Stack gucken sollen.
Ich sagte nur "von überall darauf zugreifen können" .Damit meinte ich von überall aus meinem Thread, auf den Stack des Threads. Und zwar nicht auf den Top, wo A7 hinzeigt, weil der irgendwo sein kann. Es muss immer die gleiche Stelle auf dem Stack sein.

Thomas hat es besser formuliert. Ich brauche eine globale Variable für re-entranten Code. Das User Feld im Task Struct könnte dazu nützlich sein.

Es stimmt auch, ich könnte an jeder Stelle den relativen Offset berechnen und so drauf zugreifen. Allerdings müsste ich da "von Hand" Compiler spielen, und das für hunderte Stellen berechnen, und sobald ich zwischendrin mal was ändere wieder updaten. Das geht also nicht wirklich.

--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 06.07.2010 um 18:08 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

07.07.2010, 09:13 Uhr

DrNOP
Posts: 4118
Nutzer
Zitat:
Original von thomas:
Unter AmigaOS haben Programme keine Kontrolle darüber, wann sie den Prozessor abgeben müssen und können dementsprechend die Register gar nicht definiert setzen. Jedes Programm kann mit seinen Registern machen, was es will.

Hab' ich mich jetzt ungeschickt ausgedrückt?
Eben weil kein Programm weiß wann es unterbrochen wird muß es sich darauf verlassen können, nach der Unterbrechung seine Register wieder in dem Zustand vorzufinden, in dem es unterbrochen wurde. D.h., der Unterbrechende hat dafür zu sorgen, nach der Unterbrechung einen definierten Zustand wieder herzustellen.
--
Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker

[ - Antworten - Zitieren - Direktlink - ]

07.07.2010, 09:54 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Es ist aber kein Kooperatives Multitasking o.Ä.
D.h. der Unterbrechende ist nicht ein Programm, sondern der Kernel. In meinem Programm muss ich keinerlei Vorkehrungen treffen.


Ok, also das User Feld darf ich auch nicht benutzen, da es möglicherweise das bestehende Programm schon nutzt. Bleibt also tatsächlich nur noch der fixe Anfang vom Stack Speicher?.
--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

07.07.2010, 11:44 Uhr

thomas
Posts: 7718
Nutzer
@Der_Wanderer:

Du könntest aber wenigstens so weit gehen, den Variablenbereich zu allokieren und nur die Adresse im Stack-Speicher zu halten.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

07.07.2010, 12:04 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@thomas

Ja, aber ob ich nun 4 bytes oder 32 bytes ablege, spielt vom Prinzip her keine Rolle.

Eigentlich machen mir nur 3 Sachen sorgen:

1. Ein StackSnoop würde über die Daten drüberbügeln, da oberhalb des StackPointers.

2. Eine dynamische Stack Implementation würde den Stack ständig erweitern => Crash!

3. OS4 scheint zu meckern wenn man zu nahe an den "Rand" kommt, was nicht mit einem gebührenden Abstand von 64 Bytes aber scheinbar beheben lässt.


--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 07.07.2010 um 12:05 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

07.07.2010, 12:24 Uhr

Thore
Posts: 2266
Nutzer
Ich bin der gleichen Meinung wie thomas.
Speicher pro Thread alloziieren und meinetwegen in statischen Variablen die Pointer schreiben.
Dann kann jeder Thread mit seinem eigenen Stackpointer in seinem eigenen Stack rumfahren und Daten schreiben/lesen.
Du brauchst, wenn Du nur Register retten willst, auch nur maximal 16 * 32 Bit = 64 Byte, wobei Du sicher ein Adress-Register als Stackpointer verwenden magst? D0 sollte für Rückgabewerte verwendet werden.
Dann ein movem über die nötigen Register auf deinen Stackpointer mit postincrement.

sowas wie
lea.l #MySP, a1
movem.l d0-d6/a3/a5, (a1)+

als Beispiel dafür. Sollte klappen wenn der reservierte Speicher ausreicht. (ungetestet mit diesem code, nur als Anschauungsbeispiel wie es gehen könnte)

Zu Punkt 3:
Ja mehrmaliges sichern der Register braucht dann auch mehr Stack. Gib ihm am besten gleich 150K oder so, dann bist auf der sicheren Seite :)

[ Dieser Beitrag wurde von Thore am 07.07.2010 um 12:25 Uhr geändert. ]

[ Dieser Beitrag wurde von Thore am 07.07.2010 um 12:26 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

07.07.2010, 12:57 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@Thore

Nein, so einfach ist das nicht.

Ich will Register retten. Der Code soll re-entrant sein.
Die Register würde man normalerweise auf den Stack schmeissen. Aber ich möchte auf die geretteten Register auch zugreifen, wenn der Stack nicht bis auf diese Position abgearbeitet ist.
Das ganze passiert innerhalb eines Codes, den ich nicht kontrollieren kann, d.h. alle Register können getrashed werden.
Ich füge das manuell mit einem Macro ein, d.h. Anpassungen relativ zum StackPointer sind nicht praktikabel.
Die bisher einzige Lösung ist, das an den Anfang des Stackspeichers zu schreiben. Den Pointer darauf kann man nicht aus der eigenen Task Struct holen.

Ich darf kein Register benutzen um mir was zu merken.
Ich darf nicht den StackPointer benutzen, weil ich eine fixe, jederzeit auffindbare Position brauche.
Ich darf keine Speicherzelle in der Exe benutzen, weil sie für alle Threads gleich ist, ich aber für jeden Thread eigens retten muss.

--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

07.07.2010, 13:15 Uhr

DrNOP
Posts: 4118
Nutzer
Zusammengefaßt: Du darfst nix, willst aber ein Ergebnis. Da hast du wohl ein Problem, weil das Minimalprinzip nicht so weit gilt.
--
Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker

[ - Antworten - Zitieren - Direktlink - ]

07.07.2010, 14:24 Uhr

DieterG
Posts: 164
Nutzer
Es gibt eine einfach Lösung für das Problem, erzeuge einfach einen eigenen Port, der ist jederzeit von jedem Task aus auffindbar.
Häng einfach eine "leere" message mit Deinen Daten
dran, es zwingt Dich auch keiner, über dieses Port irgendwelche Messages zu verschicken.
Über FindPort findest Du das Port jederzeit wieder, und kannst Deine "Message" auslesen.

[ - Antworten - Zitieren - Direktlink - ]

07.07.2010, 14:47 Uhr

thomas
Posts: 7718
Nutzer
@DieterG:

Er will doch, daß jeder Task seine eigenen Daten hat und nicht alle Tasks die gleichen.


--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

07.07.2010, 15:07 Uhr

Thore
Posts: 2266
Nutzer
Es gibt einen Weg über Pseudoregister (wie es z.B. Emulatoren machen)
Dabei ist jedes Register ein Stack. Du musst dir eben merken in welcher Ebene Du bist, sonst kommst durcheinander.
Also nicht ein Stack für alle Register, sondern 16 Stacks, und das pro Thread. Register retten und restoren ist dann ein programmtechnischer Mehraufwand und relativ lahm. Allerdings hast Du dann Zugriff auf alle Register zu jeder Zeit und auch zu den gesicherten direkt.
Somit wär er auch reentrant (aufpassen beim zurückschreiben, wenn Du die Ebenen verlässt, einmal vertippt gibt das seltsame Ergebnisse)
Dieters Vorschlag über Ports klingt allerdings besser und Systemnaher :)

[ Dieser Beitrag wurde von Thore am 07.07.2010 um 15:08 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

07.07.2010, 16:26 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Der_Wanderer:
Ok, also das User Feld darf ich auch nicht benutzen, da es möglicherweise das bestehende Programm schon nutzt. Bleibt also tatsächlich nur noch der fixe Anfang vom Stack Speicher?.

Wohl kaum.
Ich bin bisher davon ausgegangen, dass Du von komplett durch Dich kontrollierbaren Code gesprochen hast. Andernfalls ist die Idee, nicht reservierten Speicher zu benutzen, egal ob innerhalb "Deines" Stacks oder woanders, generell eine Schnapsidee: was passiert, wenn der Autor des restlichen Codes auf dieselbe glorreiche Idee kommt?

Wenn es sich um Code handelt, der von beliebigem anderen Code aufgerufen werden kann, kannst Du natürlich nicht den UserData-Pointer des Tasks benutzen (der gehört Dir somit genausowenig wie der Stack). Aber wenn Du wenigstens sicherstellen kannst, dass Dein Code keinen fremden Code aufruft, gäbe es noch eine Lösung: den Stack ersetzen.

Alle Routinen, die danach aufgerufen werden, können dann die im eigenen Stack abgelegten Daten direkt adressieren, und zwar nicht am unbelegten, sondern am belegten Ende.

Am Ende der gesamten Routine muss der ursprüngliche Stack wiederhergestellt werden. Innerhalb Deiner Routinen darfst Du natürlich auch fremde Routinen aufrufen, sofern Dein Stack groß genug ist, aber diese dürfen keine Call-Backs in Deinen Code ausführen, bzw. die Call-Backs dürften sich natürlich nicht darauf verlassen, dass Dein spezieller Stack aktiv ist.

Du musst Dir bei solchen Dingen immer die Frage stellen: würde das ganze auch dann noch funktionieren, wenn andere zu dem gleichen Mittel greifen?

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

08.07.2010, 08:19 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Thore:
lea.l #MySP, a1


Entweder "move.l #MySP,a1" oder den Gartenzaun weglassen.

[ - Antworten - Zitieren - Direktlink - ]

08.07.2010, 08:20 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Der_Wanderer:
Ich darf kein Register benutzen um mir was zu merken.

Warum nicht?

[ - Antworten - Zitieren - Direktlink - ]

08.07.2010, 09:25 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Also ich versuche mal den Hintergrund zu erklären:

Ich habe ein 68K Assemblerpogramm. Z.b. der Amiblitz Compiler oder ein Bars&Pipes Plugin.

Das kann man in Amiblitz3 importieren und complieren, da Amiblitz einen kompletten 68K Assembler mit drin hat. Man könnte es nun auch mit Assembler Instruktionen erweitern, kein Thema.
Aber man möchte das natürlich eher mit Amiblitz Befehlen/Funktionen erweitern. Amiblitz benötigt aber einen bestimmten Kontext, wie jeder Code einer höheren Sprache, z.b. die globalen Variablen in A5 und die lokalen in A4. Desweiteren trashed man natürlich die Register wenn man irgendein Amiblitz Befehl ausführt. Also muss ich einen Contextswitch machen, d.h. die Assembler Register retten, Amiblitz Context herstellen, und wenn ich mit Amiblitz fertig bin, Assembler Context wieder herstellen und Amiblitz Context retten.
Normalerweise würde man das über einen Register Dump auf den Stack tun.
Allerdings kann ich nicht bei jedem Switch garantieren, dass ich beim Stack immer auf der selben Position bin.

Im groben sieht das so aus:

code:
asm
asm
asm
...
asm
!switch_to_basic
basic
basic
...
basic
!switch_to_asm
asm
asm
...


* Ich kann keine Register zum Speichern benutzen weil ich nicht weis was der ASM Code tut.
* Ich kann den Stack nicht als Stack benutzen weil der ASM code recht wild ist und ich nicht garantieren kann dass er sich auf dem selben Level befindet wenn ich wieder umswitche.

Wohin also mit den Registern?
Die Momentane Lösung ist auf den Anfang des Stack Speichers.
Ein Überschreiben ist relativ unwahrscheinlich, denn dann müsste der Stack bis auf 64 Bytes komplett ausgereizt werden. In der Situation ist man sowieso nahe am Guru. Es würde nur schneller abstürzen und damit low-Stack Conditions bemerkbar machen, wie ein Overflow-Cookie.
Würde man den Stack um 64Bytes erhöhen wäre das sowieso kein Thema.

--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

08.07.2010, 09:28 Uhr

Thore
Posts: 2266
Nutzer
@gni:
richtig sorry, hatte am Anfang auch move.l, hab nur vergessen die Raute zu entfernen :) Danke für die Korrektur.

[ - Antworten - Zitieren - Direktlink - ]

08.07.2010, 09:55 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Der_Wanderer:
Allerdings kann ich nicht bei jedem Switch garantieren, dass ich beim Stack immer auf der selben Position bin.

Wieso nicht? Wenn Du Unterprogramme aufrufst, egal in welcher Sprache sie implementiert sind, sollte der Stack hinterher genauso aussehen wie vorher.
Zitat:
* Ich kann keine Register zum Speichern benutzen weil ich nicht weis was der ASM Code tut.
Ich dachte, Du hast den Code direkt vor Deiner Nase?
Zitat:
Die Momentane Lösung ist auf den Anfang des Stack Speichers.
Hast Du meinen Beitrag nicht gelesen?
Den Code soweit zu inspizieren, um festzustellen, ob er selbst einen Stack-Swap durchführt, solltest Du doch hinbekommen.

Wenn nicht, solltest Du von dieser Art der Code Erweiterung besser die Finger lassen.

Zitat:
Ein Überschreiben ist relativ unwahrscheinlich, denn dann müsste der Stack bis auf 64 Bytes komplett ausgereizt werden.
Jaaa, wie bereits gesagt, es sei denn, der Autor des Codes hatte dieselbe grandiose Idee und meinte auch, dass es total unwahrscheinlich wäre, dass jemand genau diese 64 Bytes überschreibt.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]


-1- 2 [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Der Stack gehört mir! (?) [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.