mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Assembler und GCC Übergabeparameter welche Register


Autor: Putzer Philipp (Gast)
Datum:

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

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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu... 
sind Beispiele. Vielleicht wird es dann klarer.

Autor: Christian (Gast)
Datum:

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

Autor: uzu (Gast)
Datum:

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

Autor: zonendoedel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

dann wohl eher r24 und r22...

Wenn es eine int Funktion ist, wird der return-wert wohl in r24
stehen (muessen).

Und wech...

Autor: uzu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mist, zu lahm

Autor: zonendoedel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der gute Wille zaehlt :-)

Autor: Putzer Philipp (Gast)
Datum:

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

Autor: A.K. (Gast)
Datum:

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

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.