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