Forum: Compiler & IDEs pushen und popen (msp430)


von KoF (Gast)


Lesenswert?

hallo liebe asm-freunde.

ich hab ein problem.
ich brauche 2 funktionen!!!
diese sollen für den gcc und den iar compiller geschrieben werden.
es sollen einfach register in eine struktur bzw zurück geschrieben
werden. aber es geht nicht :-( mag wohl daran liegen, das ich kein asm
mensch bin.
1
typedef struct regs
2
{
3
  uint16_t r4;
4
  uint16_t r5;
5
  uint16_t r6;
6
  uint16_t r7;
7
  uint16_t r8;
8
  uint16_t r9;
9
  uint16_t r10;
10
  uint16_t r11;
11
}regs
12
13
regs* Push(regs *task)
14
{
15
  task->r4  = asm("push  r4");
16
  task->r5  = asm("push  r5");
17
  ....
18
}
19
20
regs* Pop(regs *task)
21
{
22
  asm("pop r4") = task->r4;
23
  asm("pop r5") = task->r5;
24
        ...
25
}
könnt ihr mir dabei helfen?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Register in eine Struktur?  Was willst du denn damit tun?

Für den GCC könntest du dir wahrscheinlich mit inline asm was
zimmern, der Inline-Assembler des IAR ist aber zu blöd, auf
irgendwas anderes als globale Symbole zuzugreifen, d.h. all die
vielen schönen Paramterübergaben mitsamt den constraints, die
GCC's Inline-Assembler beherrscht, sucht man dort vergeblich.

Das Beste ist es aber vermutlich, gleich alles in Assembler zu
zimmern.

Aber mit Registern arbeiten und dann portabel sein wollen?  Das
verstehe ich nicht.  Zwischen beiden Compilern ist doch praktisch
alles, was die Register angeht, grundverschieden realisiert.

von KoF (Gast)


Lesenswert?

das da ziemlich viel unterschied besteht ist doch garkeine frage! aber
wenn man sich schön strikt an ansi-c hält ( iar wirbt nunmal damit das
sie iso/ansi konform sind), dann kann man durchaus portabel schreiben!
(nur z.b. solche sachen wie inline asm sind extrem verschieden!)

falls es interessiert, es soll eine art scheduler für den msp430
werden. es sind eigentlich verkettete listen (einfacher ansi code). nur
um diese zu füllen brauche ich compilerabhängigen code (eben das pushen
und popen)...

von Peter Dannegger (Gast)


Lesenswert?

asm ist eine Directive und kann damit weder einen Wert einlesen noch
zurückgeben.

Wenn Du in Assembler auf Variablen (SRAM-Adressen) zugreifen willst,
mußt Du das über Load (LD)* oder Store (ST)* Befehle tun.

Push, Pop greifen immer nur auf den Stack zu.


Peter


* wie die beim MSP430 heißen weiß ich nicht.

von Peter Dannegger (Gast)


Lesenswert?

"...wenn man sich schön strikt an ansi-c hält..."

Assembler und ANSI-C schließen sich gegenseitig aus !!!

Es geht nur entweder oder !


Was versprichst Du Dir überhaupt vom Einsatz von Assembler ?

Ich würde überhaupt auch nur jenem zu Assembler unter C raten, der
schonmal mindestens ein funktionierendes Programm komplett in Assembler
geschrieben hat und auch ein Compiler Listing versteht.


Peter

von Kai Klenovsek (Gast)


Lesenswert?

> Was versprichst Du Dir überhaupt vom Einsatz von Assembler ?

Da KoF von einem Scheduler sprach, hört sich das sehr nach einem RTOS
an ;-).

von KoF (Gast)


Lesenswert?

genau... ein rtos soll es werden.
(jetzt bitte nicht davon reden, warum man das rad neu erfinden soll /
es schon eine halbe mil. von ihnen gibt.)

ich mache es, um es gemacht zu haben/um daraus zu lernen. mir ist schon
klar, das es eine unzahl von ihnen gibt, doch das interessiert mich aus
eben diesen gründen nicht!

von KoF (Gast)


Lesenswert?

aja... den gcc teil habe ich (glaube ich) geknackt ;-)
1
//save the registers
2
#define OS_Push_GCC()        \
3
  asm volatile (  "push  r4  \n\t"  \
4
          "push  r5  \n\t"  \
5
          "push  r6  \n\t"  \
6
          "push  r7  \n\t"  \
7
          "push  r8  \n\t"  \
8
          "push  r9  \n\t"  \
9
          "push  r10  \n\t"  \
10
          "push  r11  \n\t"  \
11
          "push  r12  \n\t"  \
12
          "push  r13  \n\t"  \
13
          "push  r14  \n\t"  \
14
          "push  r15  \n\t"  \
15
         );
16
// restore the registers
17
#define OS_Pop_GCC()        \
18
  asm volatile (  "pop  r15  \n\t"  \
19
          "pop  r15  \n\t"  \
20
          "pop  r14 \n\t"  \
21
          "pop  r13  \n\t"  \
22
          "pop  r12  \n\t"  \
23
          "pop  r11  \n\t"  \
24
          "pop  r10  \n\t"  \
25
          "pop  r9  \n\t"  \
26
          "pop  r8  \n\t"  \
27
          "pop  r7  \n\t"  \
28
          "pop  r6  \n\t"  \
29
          "pop  r5  \n\t"  \
30
          "pop  r4  \n\t"  \
31
          "reti    \n\t"  \
32
        );

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wenn du das in einzelne Zeilen aufteilst, statt einen großen
Klumpen zu nehmen, sollte das auch der IAR können.  Kann sein,
dass er kein volatile in Zusammenhang mit asm versteht, kann
auch sein, dass du unbedingt _asm oder __asm_ schreiben
musst, ich hab' das Manual gerade nicht hier.

von KoF (Gast)


Lesenswert?

iar, wie auch mspgcc verwenden zur erkennung beide asm("<todo>") als
syntax. aber wie das mit der aufteilung von mehreren befehlen jetzt im
iar aussieht, darum kümmere ich mich jetzt ;-)

von Rolf Magnus (Gast)


Lesenswert?

> Assembler und ANSI-C schließen sich gegenseitig aus !!!

Eigentlich nicht. asm ist sogar ein Schlüsselwort in ANSI/ISO-C.
Natürlich ist die Syntax dort nicht definiert und damit das Programm
auch nicht portabel.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> asm ist sogar ein Schlüsselwort in ANSI/ISO-C.

Ich wollte mich gerade wundern...  Aber dem ist natürlich nicht
ganz so.

asm ist unter "J.5 Common extensions" aufgeführt.  Damit ist es
ganz deutlich kein Bestandteil des Standards.

von Rolf Magnus (Gast)


Lesenswert?

Ok, aber es wird zumindest erwähnt ;-)
Hab's wohl mit C++ verwechselt. Dort ist es so wie ich sagte.
Mea culpa

von KoF (Gast)


Lesenswert?

arg... mistmadiger iar...
kann mir jemand sagen, wie ich das vom gcc auf iar portieren soll???
1
__asm__ __volatile__("mov.w SP, %0" : "=r" (CurrentTask->stack));
2
...
3
__asm__ __volatile__("mov.w %0, SP" : : "m" (CurrentTask->stack));

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Knick es.  Wie ich dir eingangs schon schrob, der Inline-Assembler
des IAR ist saublöd, verglichen mit dem des GCC.

Schreib den ganzen Krempel lieber als separates Assemblerfile.

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.