Hi, ich habe mal eine Frage zu folgendem Quelltext:
;void lcd_gotoxy(u08 x, u08 y);
.global lcd_gotoxy
.func lcd_gotoxy
lcd_gotoxy:
mov r24, r26
rcall lcd_wrcmd
mov r24, r25
rcall lcd_wrcmd
ret
.endfunc
So nun zur Frage: Woher weiß ich in welcher Variable z.b. der wert x
hinterlegt wird. Also hier sollte er in die Variable r24 kommen, wie
kann ich das festlegen?
MFG Jörn
Du kannst das nicht festlegen, der Compiler legt das fest: http://savannah.nongnu.org/download/avr-libc/doc/avr-libc-user-manual/FAQ.html#faq_reg_usage Dementsprechend kommen Deine Parameter in r24 und r22 rein. r24 kannst Du gleich weiterreichen (falls der erste Aufruf der für den x-Wert sein soll), danach mov r22, r24. Den letzten rcall und das folgende ret kannst Du durch einen rjmp ersetzen -- wenn Du sowas schon unbedingt in Assembler nageln mußt. ;-)
Erstmal Danke für die schnelle Antwort, das habe ich soweit kapiert:
Also: 1. Wert der Funktion = r24
2. Wert der Funktion = r22
Doch wo kommt der 3. oder eventuell auch 4. oder 5. rein??
MFG Jörn
(Ja, soweit es sich um 8-Bit-Werte handelt.) Nun, das steht doch eigentlich auch dort: bis zu r8 hinab werden sie in Registern übergeben, wobei für die Benutzung von MOVW jeweils eine Ausrichtung auf 16 Bits erfolgt: also r20, r18, r16, ... Parameter mit mehr als 16 Bits benötigen entsprechend mehr Register. Noch mehr Parameter müssen aufwendig über den Stack übergeben werden, gleichfalls `variadic function parameters', also variable Argument- listen (wie bei printf()).
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.