mikrocontroller.net

Forum: Compiler & IDEs Variablenübergabe in Assembler


Autor: Lars Lochmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lars Lochmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.htm...

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.

Autor: Lars Lochmann (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.