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.