Forum: Mikrocontroller und Digitale Elektronik [GCC, ASM] Zugriff auf eine Struktur im Assembler-Modul


von henne (Gast)


Lesenswert?

Hallo zusammen,

ich habe eine Funktion, bei der es wirklich einmal auf den letzten Takt 
ankommt. Diese wird als Assembler-Modul geschrieben.

In diesem Modul muss ich nun auf Einträge in einer globalen Struktur 
zugreifen. Wie gelingt das?

Beispiel:

in global.h ist definiert:

struct test{
  uint8_t    Array[3];
         uint16_t   Word;
  }tst;


in my_funct möchte ich:

extern tst.Array

lds   temp, tst.Array
lds   tempB, tst.Array +1


Momentan befürchte ich, dass der Compiler die Position nicht ermitteln 
kann - obwohl sie eigentlich bekannt sein sollte...

Momentan bin ich etwas ratlos.

Viele Grüße,
Hendrik

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

henne schrieb:
> Hallo zusammen,
>
> ich habe eine Funktion, bei der es wirklich einmal auf den letzten Takt
> ankommt. Diese wird als Assembler-Modul geschrieben.
>
> In diesem Modul muss ich nun auf Einträge in einer globalen Struktur
> zugreifen. Wie gelingt das?
>
> Beispiel:
>
> in global.h ist definiert:
>
> struct test{
>   uint8_t    Array[3];
>          uint16_t   Word;
>   }tst;
>
> Momentan befürchte ich, dass der Compiler die Position nicht ermitteln
> kann - obwohl sie eigentlich bekannt sein sollte...

Der Compiler kann das auch nicht bestimmen ;-) Ist aber garnicht nötig

Der Zugriff geht einfach per
1
lds   r25, tst+3 ; low-byte von .Word

Allerdings musst du sicherstellen, daß nicht vielleicht Füllbytes in der 
Struktur erzeugt werden:
1
struct test
2
{
3
    uint8_t    Array[3];
4
    uint16_t   Word;
5
} __attribute__((packed)) tst;

oder genau wissen, wo diese evtl. sitzen und das im Asm berücksichtigen. 
Als Anhaltspunkt kannst du einfach in die Assembler-Ausgabe des 
Compilers schauen, zB mit -save-temps bei GCC (s-File).

Johann

von henne (Gast)


Lesenswert?

Danke, Johann!

Das hatte ich so auch schon gemacht - nur darf dabei die Struktur von 
keinem nachträglich geändert und das asm-Modul vergessen werden...

Deshalb hatte ich noch Hoffnung, dass es an mir liegt ;-)

VG,
Hendrik

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.