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


von Putzer Philipp (Gast)


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.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

von Stefan (Gast)


Lesenswert?


von Christian (Gast)


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.

von uzu (Gast)


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?!

von zonendoedel (Gast)


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...

von uzu (Gast)


Lesenswert?

mist, zu lahm

von zonendoedel (Gast)


Lesenswert?

Der gute Wille zaehlt :-)

von Putzer Philipp (Gast)


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

von A.K. (Gast)


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.

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