Hallo! Ich habe eine Frage zur Registerverwendung. Ich habe ein Ass-Programm geschrieben, und will dieses im C-Code auffrufen. Es werden 2 Parameter (char) übergeben. Nun muss ich ja im assembler-prog die richtigen register verwenden, also die, in denen der GCC die Parameter ablegt, oder? Ich habe zwar lange gesucht, bin auch auf eine recht vage registerverwendung gestoßen http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_reg_usage was ist gemeint mit "Function call conventions: Arguments - allocated left to right, r25 to r8. All arguments are aligned to start in even-numbered registers (odd-sized arguments, including char, have one free register above them). This allows making better use of the movw instruction on the enhanced core" heißt das, wenn ich zb zwei werte übergeben, dass diese dann in R25 und R24 gespeichert sind? überschneiden sie sich dann nicht mit den rückgabewerten, bzw ist so eine überschneidung egal? hoffe mir kann jemand helfen vielen dank und schöne grüße philipp
In http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Assembler_und_Inline-Assembler sind Beispiele. Vielleicht wird es dann klarer.
Also ich verstehe "All arguments are aligned to start in even-numbered registers (odd-sized arguments, including char, have one free register above them)" so, dass Deine beide Char-Argumente in R24 und R22 landen. Der Rückgabewert liegt je nach Datentyp in R24 (Byte), R25:R24 (Word) usw. Warum sollte diese Überschneidung ein Problem sein? Hint: Probier es aus, schau Dir das Assembler-Listing an, dann weißt Du, was der Compiler tatsächlich generiert.
Hmm, ich dachte immer, C würde die Parameter auf dem Stack übergeben? Ahh, okay: "If too many, those that don't fit are passed on the stack." Vielleicht bringts dich ja weiter, wenn du dir eine C Funktion schreibt, die zwei chars als Parameter entgegenimmt und dir dann anschaust, was der gcc draus macht. Wenn der die angegebenen Register benutzt, wirds wohl so sein. "All arguments are aligned to start in even-numbered registers (odd-sized arguments, including char, have one free register above them)." Verstehe ich so, dass deine beiden Chars in Reg24 und Reg22 zu liegen kommen. "Return values: 8-bit in r24 (not r25!), 16-bit in r25:r24, up to 32 bits in r22-r25, up to 64 bits in r18-r25. 8-bit return values are zero/sign-extended to 16 bits by the caller (unsigned char is more efficient than signed char - just clr r25). Arguments to functions with variable argument lists (printf etc.) are all passed on stack, and char is extended to int." Ja, das return value überschreibt wohl Reg24. Aber die Funktionsparameter brauchst du dann doch sowieso nicht mehr?!
Moin, dann wohl eher r24 und r22... Wenn es eine int Funktion ist, wird der return-wert wohl in r24 stehen (muessen). Und wech...
Super, danke! werd mir mal das list-file angucken, aber ich denke es wird dann wohl ziemlich sicher das register 24 und 22 sein. Das ich den übergabeparamter nach der funktion nicht mehr brauche, daran habe ich wohl nicht gedacht. vielen dank nochmal grüße philipp
> ich dachte immer, C würde die Parameter auf dem Stack übergeben?
C definiert in dieser Hinsicht garnichts. Wenn die Maschine genug
Register hat, wär's Unsinn sie nicht zu verwenden. Antike Compiler waren
noch nicht so weit, daher wars anfangs meist so, aber das hat sich
mittlerweile geändert.
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.