Zugriff auf globale C Variablen in inline Assembly (Cortex

Gast #3418318
Lesenswert?
• ▲
▼
Hallo zusammen,
da ich jetzt schon den halben Tag mit suchen verbringe und immernoch 
keine Loesung habe, dachte ich mir ich frage mal euch...

Und zwar folgendes Problem:

Ich muss auf meinem Cortex M4F in einem Inline ASM auf Variablen meines 
C Programms zugreifen und diese dort auch editieren. Als Compiler nutze 
ich CCS und der mC ist ein Stellaris LX4F120H.

In C habe ich die Variable wie folgt initialisiert: int start = 0;

Und so habe ich es jetzt schon erfolglos in meinem inline ASM versucht:
    //asm("    .global start        ");
    //asm("    .extern start        ");

auf dem weg (    asm("     .ref _start");) bekomme ich keine 
Fehlermeldung aber ich bekomme bei einem spaeteren Versuch auf die 
Variable zu schreiben immer eine Fehlermeldung:

line 394: [E0004] Destination operand Rd must be a register
      LDR _start, R12
line 394: [E0004] Invalid addressing mode
      LDR _start, R12



Ich versuche da jetzt wirklich schon endlose Stunden dran rum und habe 
auch schon das halbe Internet danach durchforstet aber bisher ohne 
Erfolg. daher waere ich euch sehr dankbar wenn ihr mir helfen koenntet 
;-)
Gast #3418443
Lesenswert?
• ▲
▼
merbe schrieb:
> Ich muss auf meinem Cortex M4F in einem Inline ASM auf Variablen meines
> C Programms zugreifen und diese dort auch editieren.

Entsprechend dem Procedure-Call-Standard-For-ARM werden beim 
C-Funktionsaufruf die ersten 4 Variablen in den Registern R0-R3 
abgelegt. Eine Möglichkeit auf globale Variable zuzugreifen ist also der 
C-Funktion Pointer darauf zu übergeben, und dann Inline darauf 
zuzugreifen, also z.B.

unsigned int start;

void myfunc(unsigned int *start)
{
  asm("LDR R4, [R0]");
  ...
  asm("STR R4, [R0]");
}

void main(void)
{
  myfunc(&start);
}
Gast #3421217
Lesenswert?
• ▲
▼
merbe schrieb:
> line 394: [E0004] Destination operand Rd must be a register
>       LDR _start, R12
> line 394: [E0004] Invalid addressing mode
>       LDR _start, R12

Steht bei LDR nicht zuerst das Zielregister und dahinter die Quelle?

Und absolute Adressierung ist auf dem ARM sowieso schwierig, weil der so 
konsequent 32bit-RISC ist, daß er im Befehl keinen Platz für die Adresse 
hat.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.