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?
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.