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 - ]

08.07.2010, 11:27 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@Holger:

> Wieso nicht? Wenn Du Unterprogramme aufrufst, egal in welcher Sprache sie implementiert sind, sollte der Stack hinterher genauso aussehen wie vorher.
Der Code springt manchmal etwas wild durcheinander.
In 99% der Fällte stimmt es, aber nicht immer.

> Ich dachte, Du hast den Code direkt vor Deiner Nase?
Ja, aber er ist zu groß um ihn manuell zu verifizieren/modifizieren.

Das mit dem Stackswap muss ich mir nochmal anschauen.

> 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.
Ich denke das kann man ausschliessen, weil die Sourcen ursprünglich ja nicht dieses Problem hatten. Und wenn doch sowas gemacht wird, dann geht eben nicht, wird man aber schnell merken.

Ich schaue mir das aber nochmal an, ob man nicht doch garantieren kann dass der Stack immer abgearbeitet ist.

--
--
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, 11:46 Uhr

thomas
Posts: 7675
Nutzer
@Der_Wanderer:

Zitat:
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.

Dann hast du doch dein Basisregister (A5). Du mußt nur noch eine globale Variable für deinen "Context" reservieren.

Zitat:
Desweiteren trashed man natürlich die Register wenn man irgendein Amiblitz Befehl ausführt.

Wieso das denn ? AmiBlitz muß sich doch an seine eigenen Konventionen halten und z.B. A4 und A5 nicht überschreiben.

Zitat:
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.

Warum mußt du einen Switch machen? Warum kannst du nicht den AmiBlitz Kontext beibehalten? So viele Register wird Amiblitz ja nicht für sich beanspruchen (A4 und A5 offenbar).

Gruß Thomas


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

[ - Antworten - Zitieren - Direktlink - ]

08.07.2010, 13:24 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@thomas:

> Dann hast du doch dein Basisregister (A5). Du mußt nur noch eine globale Variable für deinen "Context" reservieren.
Das geht nicht, weil der Code ja re-entrant sein muss. Würden zwei Threads auf dem Code laufen, würden sie sich gegenseitig die Register-Kopien überschreiben.

>> Zitat:
>> Desweiteren trashed man natürlich die Register wenn man irgendein
>> Amiblitz Befehl ausführt.
> Wieso das denn ? AmiBlitz muß sich doch an seine eigenen Konventionen > halten und z.B. A4 und A5 nicht überschreiben.
Amiblitz schon, aber der ASM Code nicht, in den es implantiert wird. In ASM gibt es keine Konventionen, welche Register getrashed werden dürfen und welche nicht, ausser evtl. A7.
Die Amiblitz Befehle können alle Register trashen, ausser denen die Amiblitz statisch hält. So herum hätte der ASM Code probleme.

Beispiel:
code:
...
move.l #1234,d2
NPrint "Hallo Welt"
add.l #1,d2 ; <= in d2 steht nicht mehr 1234
...

Das NPrint könnte d2 trashen.

Andersherum:

code:
...
x.l = 0 ; <= x wird über GlobalBase adressiert
move.l #12345,a5
NPrint x ; Guru, da a5 nicht mehr Pointer zu GlobalBase
...


Bei diesen einfachen Beispielen würde jeder von uns die Register auf den Stack retten.
Aber die Codes in der Realität sind sehr viel komplexer.

--
--
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 08.07.2010 um 13:39 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

08.07.2010, 13:49 Uhr

thomas
Posts: 7675
Nutzer
@Der_Wanderer:

Zitat:
Das geht nicht, weil der Code ja re-entrant sein muss. Würden zwei Threads auf dem Code laufen, würden sie sich gegenseitig die Register-Kopien überschreiben.

Unsinn. Entweder der ganze Code ist reentrant, dann hat jeder Thread sein eigenes A5-Register, oder sie teilen den Speicher, dann ist der Code eben nicht reentrant.

Zitat:
Das NPrint könnte d2 trashen.

Es gibt mit Sicherheit eine Konvention, die besagt, welche Register nicht "getrasht" werden. Bei C z.B. dürfen nur D0, D1, A0, und A1 frei benutzt werden, alle anderen Register müssen zumindest über Funktionsaufrufe hinweg erhalten bleiben.

Im übrigen könntest du dich hier genauso A4 und A5 bedienen, wie der Basic-Code das auch macht. Du mußt nur dafür sorgen, daß im Basicprogramm die entsprechenden Variablen deklariert werden, die du dann im Assembler-Teil benutzt.

Zitat:
move.l #12345,a5

Das ist auch Unsinn. Entweder du hältst dich an die Konventionen, dann darfst du A5 nicht benutzen, oder du willst dich nicht dran halten, dann ist dein ganzes Projekt gestorben. Dafür sind Konventionen da.

Gruß Thomas

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

[ - Antworten - Zitieren - Direktlink - ]

08.07.2010, 14:25 Uhr

Der_Wanderer
Posts: 1229
Nutzer
@thomas
Lies die vorherigen Posts nochmal aufmerksam, wenn du sinnvoll antworten willst.

> Unsinn. Entweder der ganze Code ist reentrant, dann hat jeder Thread
> sein eigenes A5-Register, oder sie teilen den Speicher, dann ist der
> Code eben nicht reentrant.
Nicht Unsinn. In A5 steht die Global Base, die ist bei jedem Thread gleich. Wenn man die schreibend benutzt, ist der Code nicht re-entrant.
Aber darum gehts ja nicht.

> Es gibt mit Sicherheit eine Konvention, die besagt, welche Register nicht "getrasht" werden.
A4 und A5 werden nicht getrashed. In Amiblitz Code. Was der ASM code macht kann man nicht garantieren.

> Das ist auch Unsinn. Entweder du hältst dich an die Konventionen, dann darfst du A5 nicht benutzen,
Du hast das nicht verstanden.

Ich schreibe kein neues Programm. Sonst könnte ich mich natürlich arrangieren und an Konventionen halten.
Ich füge BASIC Code (wenn du so willst) in ein bestehendes ASM Programm ein, dessen Konventionen ich nicht kenne. Es sind auch zu viel Zeilen Code als dass ich es anpassen könnte oder wollte.

Ich möchte nun an jeder beliebigen Stelle BASIC Code einfügen. D.h. der Basic Code darf keine ASM Register trashen und der ASM Code darf keine BASIC Register trashen.

ASM kann potentiel alle Register trashen (ausser sagen wir mal a7)
BASIC kann potentiel alle Register trashen ausser A4 und A5 und A7
Da ich aber A4 und A5 herstellen muss für Basic, trashed es aus ASM Sicht auch diese Register.

Die einzige Konvention die es gibt ist d0, der bleibt unberührt. Dadurch kann man Informationen von Basic nach ASM austauschen.
Da muss man dann darauf achten, dass die Stelle, an der man den BASIC Code einbaut, keine Daten in D0 hat.


--
--
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 08.07.2010 um 14:28 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

08.07.2010, 16:23 Uhr

Thore
Posts: 2266
Nutzer
Du fügst BASIC Code ein in ein ASM Programm dessen Konventionen Du nicht kennst. Ich nehm an, daß Du dann auch nicht genau weißt, was dieses Programm macht...?
Da stell ich mir die Frage warum Du BASIC Code hier einfügen willst.

Andere Frage die ich doch interessant fände... wie soll der BASIC Code eingefügt werden? Ein BASIC Compiler mit asm Möglichkeit? Precompiler? Per Linklib Funktionen aufrufen?
Wenn Du vor dem BASIC Aufruf die Register rettest, und beim Verlassen wieder zurückschreibst... wieso sollte das nicht gehen?

Ich denk, weil wir Dein Programm nicht kennen, und nicht wissen warum Du es gerade anders brauchst als der Standard-Weg ist, kommen wir auch nicht zu einer richtigen Lösung :)

[ - Antworten - Zitieren - Direktlink - ]

08.07.2010, 16:59 Uhr

Holger
Posts: 8090
Nutzer
Zitat:
Original von Der_Wanderer:
> Ich dachte, Du hast den Code direkt vor Deiner Nase?
Ja, aber er ist zu groß um ihn manuell zu verifizieren/modifizieren.

Ähem, was heißt hier manuell?
Nach Vorkommen von "A4" oder "A5" sollte man mit jedem 08/15-Texteditor suchen können.

Ansonsten hängt es natürlich davon ab, wie oft oder lange Du mit diesem Assembler-Code beschäftigt sein wirst, ob es sich lohnt, Werkzeuge zu entwickeln, die Dir Arbeit mit dem Code abnehmen.

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

[ - Antworten - Zitieren - Direktlink - ]

08.07.2010, 17:03 Uhr

Holger
Posts: 8090
Nutzer
Zitat:
Original von Thore:
Andere Frage die ich doch interessant fände... wie soll der BASIC Code eingefügt werden? Ein BASIC Compiler mit asm Möglichkeit? Precompiler? Per Linklib Funktionen aufrufen?

Das wurde schon gesagt.
Zitat:
Wenn Du vor dem BASIC Aufruf die Register rettest, und beim Verlassen wieder zurückschreibst... wieso sollte das nicht gehen?
Weil der Basic-Status zwischen zwei Basic-Aufrufen ebenfalls erhalten bleiben soll, der Assembler-Code aber höchstwahrscheinlich alle Register, inkl. des Stacks-Pointers, zwischendurch verändert. Und jeder Thread hat seinen eigenen Status...

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

[ - Antworten - Zitieren - Direktlink - ]

09.07.2010, 08:05 Uhr

tboeckel
Posts: 124
Nutzer
Zitat:
...der Assembler-Code aber höchstwahrscheinlich alle Register, inkl. des Stacks-Pointers, zwischendurch verändert.

Wie soll unter diesen Voraussetzungen der Rücksprung zur Stelle eines vorherigen "bsr" oder "jsr" funktionieren?

[ - Antworten - Zitieren - Direktlink - ]

09.07.2010, 09:30 Uhr

Thore
Posts: 2266
Nutzer
@Holger:
alles klar :)

[ - Antworten - Zitieren - Direktlink - ]

09.07.2010, 11:28 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Ich denke es gibt keine gute Lösung für dieses Problem.
Daher werde ich wohl bei dem fixen Stack bleiben.

Ich kann evtl. noch versuchen, Stellen die nicht auf dem gleichen Stacklevel switchen, zu verbessern, dann wäre ein normales Retten auf den Stack möglich.


--
--
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 - ]

09.07.2010, 13:53 Uhr

Holger
Posts: 8090
Nutzer
Zitat:
Original von tboeckel:
Wie soll unter diesen Voraussetzungen der Rücksprung zur Stelle eines vorherigen "bsr" oder "jsr" funktionieren?

Bevor der Code zurückkehrt, stellt er natürlich den ursprünglichen Stack-Zustand wieder her. Aber der Code kann in den Basic-Kontext wechseln, ohne gleich zum Ausgangspunkt zurückzukehren.
Der Assembler-Code besteht ja nicht aus Unterprogrammen, die aus Basic heraus aufgerufen werden, sondern der Assembler-Code soll Basic-Fragmente aufrufen.

--
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-2022 by amiga-news.de - alle Rechte vorbehalten.
.