Forum: Compiler & IDEs Variablenübergabe in Assembler


von Lars Lochmann (Gast)


Lesenswert?

Ich habe mir im Tutorial mal die Assemblerroutinen angesehen.
Da werden ja Variablen beim Assembler-Funktionsaufruf übergeben und auch 
von der Assemblerfunktion wieder zurück gegeben. Im Tutorial ist das 
r24, dann r22 usw. Kann man das irgendwie einstellen oder beieinflussen? 
Ist das eventuell immer so?

von Rolf Magnus (Gast)


Lesenswert?

Wenn du rein in Assembler arbeitest, kannst du die Parameter übergeben, 
wie du Lust hast. Dem Assembler ist das vollkommen wurscht. Du mußt sie 
halt nur in der Funktion aus den Registern lesen, in die du sie vor dem 
Aufruf reingeschrieben hast.
Falls du mit einer Hochsprache (C oder so) interagieren willst, mußt du 
dich an die Aufrufkonventionen des Compilers halten. Auch hier ist es 
dem Assembler ziemlich schnuppe, was du machsst.

von Lars Lochmann (Gast)


Lesenswert?

Danke erstmal für deine Antwort. :-)
Ich möchte in AVR-GCC schreiben. Da schreibe ich in C und möchte 
Assemblerroutinen (also Source files) einbinden. Die sollen aber 
Variablen aus dem C Source File übernehmen und übergeben. Das 
Funktioniert auch schon genau so wie im Tutorial beschrieben. Die erste 
zu übergebende Variable steht in r24, dann r22 und so weiter.
Mein Frage war ob das immer zwingend so ist, ob man das beeinflussen 
kann und warum es so gewählt wurde, falls es so fest ist?
Mit dieser Aufteilung würden ja die X,Y,Z Register unberührt bleiben.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Lars Lochmann wrote:

> Mein Frage war ob das immer zwingend so ist, ob man das beeinflussen
> kann

Ja, für den AVR-GCC ist das fest so.  Das Ganze ist effektiv Teil des
sogenannten ABI (application binary interface) und ist hier:

http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_reg_usage

beschrieben.

> und warum es so gewählt wurde, falls es so fest ist?

Da musst du die Autoren des AVR-GCC fragen, insbesondere wohl Denis
Chertykov.

Grundsätzlich hat die Benutzung von Registern oberhalb 16 dahingehend
Sinn, dass man in diese relativ einfach Direktoperanden laden kann.
Das braucht man bei einem Funktionsaufruf häufig.  Da man die
Zeigerregister nicht für die Parameterübergabe vordefinieren will,
bleiben also effektiv r16 bis r25.

Wäre eigentlich als Einziges zu fragen, warum Denis damals nicht bei
r16 aufsteigend begonnen hat.  Diese Variante hat der IAR gewählt.

> Mit dieser Aufteilung würden ja die X,Y,Z Register unberührt bleiben.

Die Zeigerregister will man nicht für Parameter vorbelegen.  Parameter
können ja alles mögliche sein, das zur Compilezeit nicht bekannt ist,
und in C musst du auch damit leben, dass der Compiler (für eine
prä-C89-Definition) gar nicht weiß, welche Argumente die gerufene
Funktion tatsächlich mit welchem Typ bewertet.

von Lars Lochmann (Gast)


Lesenswert?

Dankeschön Jörg für deine Antwort. :-)
Werd das jetzt gleich mal noch bissl testen. ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.