Forum: Compiler & IDEs ASM Funktion, welche Register zwischenspeichern?


von Yaro G. (yaro)


Lesenswert?

Hallo Leute, ich bin gerade dabei, eine ASM Funktion zu schreiben und 
sie in meinen C-Code einzubinden.
Dabei bin ich im Zusammenhang mit der Parameterübergabe auf einen 
Widerspruch gestoßen, den ich nciht recht verstehe:
http://www.gnu.org/savannah-checkouts/non-gnu/avr-libc/user-manual/FAQ.html#faq_reg_usage
hier steht nämlich:
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.

und...

Call-saved registers (r2-r17, r28-r29):
May be allocated by gcc for local data. Calling C subroutines leaves 
them unchanged. Assembler subroutines are responsible for saving and 
restoring these registers, if changed. r29:r28 (Y pointer) is used as a 
frame pointer (points to local data on stack) if necessary. The 
requirement for the callee to save/preserve the contents of these 
registers even applies in situations where the compiler assigns them for 
argument passing.

Wenn die Register r8 - r25 durch Parameterübergabe an eine Funktion 
geändert wurden, dann kann die Funktion die alten Werte doch überhaupt 
nicht zwischenspeichern! Soll man die Register dann trotzdem 
zwischenspeichern?
Wie soll man das verstehen?

Gruß, Yaro

von Stefan E. (sternst)


Lesenswert?

Das ist doch ganz einfach:
Wenn deine ASM-Funktion in den Registern r8-25 Parameter bekommt, dann 
muss am Ende deiner Funktion in r8-17 das Gleiche stehen wie zu Beginn, 
r18-25 dürfen verändert sein.

von Yaro G. (yaro)


Lesenswert?

OK, danke schön

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.