Assembler und GCC Übergabeparameter welche Register

Gast #517268
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
Gast #517287
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.
Gast #517288
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?!
Gast #518279
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
Gast #518285
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren