Wie richtig: avrgcc inline assemler

Gast #3027974
Lesenswert?

Hallo zusammen,

ich bin ziemlich ratlos. Nach langem hin und her probieren
weiß ich leider nicht wie das gehen soll
1
int main(void) {
2
  uint8_t tmp;
3
  uint16_t addr = 0;
4
  while(1) {
5
    //__asm volatile("ldi r31, %B0" : : "0" ((addr >> 8) 0xFF));
6
    //__asm volatile("ldi r30, %1" : : "I" (addr & 0xFF));
7
    __asm volatile("lpm");
8
    __asm volatile ("ld %0, r0" : "=l" (tmp));
9
    addr += 1;
10
    PORTD = ~tmp;
11
    _delay_ms(100);
12
  }
13
}

Ich will Z pointer (r31:r30) mit addr laden, um danach mit lpm Befehl
den Flash auszulesen und das Ergebnis in r0 in tmp zu schieben und
am Port auszugeben.

Wie zum Teuf** lautet die richtige Syntax dafür?
Ich verstehe wohl nicht ganz was die "constraints" bewirken.
Mir scheint das gcc inline assembly "kind of" vermurkst ist.
Das was aktuell in den kommentierten Zeilen steht, ist mein letzter 
Versuch gewesen.

Mein Dank im Voraus.
Daniel
Gast #3028024
Lesenswert?

A. K. schrieb:
> daniel schrieb:
>> Wie zum Teuf** lautet die richtige Syntax dafür?
>
> #include <pgmspace.h>
> ... = pgm_read_byte(addr);

Der Vorschlag hilft sicher vorübergehend.

>Also ich würd dir glatt anraten das als Funktion in eine Assemblerdatei
>auszulagern.
>GCC Registerkonventionen kennste?

Nicht wirklich. Ich müsste mir das anlesen.

Ich halte gcc inline asm insofern für bessere Lösung, weil ich dieses
Wissen auch bei ARM einsetzen gedenke.

Kennt jemand vielleicht die "inline" Lösung?

Gruß,
Daniel

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