Forum: Compiler & IDEs funktionen in Assembler


von Jörn (Gast)


Lesenswert?

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

von Joerg Wunsch (Gast)


Lesenswert?

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

von Jörn (Gast)


Lesenswert?

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

von Joerg Wunsch (Gast)


Lesenswert?

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