C Makros in Assembler

OP #6751878
Hallo zusammen,

ich bin noch bei meinen ersten Gehversuchen mit Assembler und frage 
mich, ob es möglich ist, Makro-Definitionen in C-Headern in 
Assembler-Dateien zu nutzen.

Wenn es nicht so geht, werde ich wohl einen Umweg suchen müssen.

Was ich schon gefunden habe: Generell können C-Header-Dateien mit 
.include eingebunden werden, wenn diese nur #defines enthalten. Gut.

Ich habe jetzt eine Header-Datei, die nur Pin-Definitionen enthält, z.B.
1
    // config.h
2
    #define TST0_PIN PA0
3
    #define TST1_PIN PA1

Unter C nutze ich die so:
Es gibt eine weitere Header-Datei, in der die Pin-Bezeichnungen 
zugewiesen werden:
1
    // pins.h
2
    #define PA0  GPIOA, GPIO_Pin_0
3
    #define PA1  GPIOA, GPIO_Pin_1
4
    ...
5
  
6
    /** Hilfs-Makro: Erstes Argument */
7
    #define _arg1(a,b) a
8
    
9
    /** Hilfs-Makro: Zweites Argument */
10
    #define _arg2(a,b) b
11
    
12
    
13
    /** Aus Makros wie PB0: GPIOB, GPIO_Pin_0 wieder GPIOB zurueckgewinnen
14
     * (Makro-Version der Funktione gpio_port() ) */
15
    #define GPIO_PORT(ab)   _arg1(ab)
16
    
17
    /** Aus Makros wie PB0: GPIOB, GPIO_Pin_0 wieder GPIO_Pin_0 zurueckgewinnen
18
     * (Makro-Version der Funktione gpio_pin() ) */
19
    #define GPIO_PIN(ab)    _arg2(ab)

Und in meiner C-Datei nutze ich das entsprechend:
1
  GPIO_t GPIOx = GPIO_PORT(TST0_PIN);
2
  GPIOx->BSRR = GPIO_PIN(TST_PIN);
und die Welt ist einfach.

Wie schön wäre es doch, wenn ich die Config-Datei weiternutzen könnte.

Also:
1
.syntax unified
2
.cpu cortex-m3
3
.thumb
4

5
@ hw_config.h laesst sich importieren, weil sie nur aus MAKRO-Definitionen besteht.
6
.include "hw_config.h"
7

8
@ sollte auch noch gehen
9
#define PA8  GPIOA, GPIO_Pin_8
10

11

12
GPIOA = 0x40010800
13
GPIO_Pin_0 = 1<<0
14

15
.macro GPIO_PORT port pin
16
  \port
17
.endm
18

19
.macro GPIO_PIN port pin
20
  \pin
21
.endm
22

23
.text
24
.type asmtestfcn, %function
25
.global asmtestfcn
26
asmtestfcn:
27
    ldr r0, =GPIO_PORT( GPIOA, GPIO_Pin_0 )
28
    ldr r1, =GPIO_PIN( GPIOA, GPIO_Pin_0 )
29
    str r1, [r0, #GPIOx_BSRR]
30
    bx lr
Der Assembler wirft mir vor: "Error: garbage following instruction -- 
`ldr r0,=GPIO_PORT(GPIOA,GPIO_Pin_0)'"
und ich kann dem noch nicht einmal widersprechen.

Kann mir jemand einen Anstoß geben, wie ich mein Vorhaben umsetzen kann?
Moderator Persönliche Seite #6751890
Der GCC (den benutzt du wohl) schickt alle .S-Dateien (also solche, die 
auf der Kommandozeile ein großes "S" als Suffix haben) standardmäßig 
über den C-Präprozessor und erst danach zum Assembler.

Da brauchst du auch kein .include, sondern kannst ganz normal mit 
#include arbeiten.

Die Header selbst können ggf. Dinge, die ein Assembler nicht verstehen 
kann (bspw. C-structs) via
1
#ifndef __ASSEMBLER__
2
...
3
#endif

vor dem Assembler schützen.

Damit kannst du auf die ganz normalen C-Makros zugreifen in der von C 
gewohnten Weise.

Assembler-Makros wiederum sind eine völlig andere Baustelle.
OP #6751898
Jörg W. schrieb:
> Damit kannst du auf die ganz normalen C-Makros zugreifen in der von C
> gewohnten Weise.

Das ist ja famos! Vielen Dank, damit hast Du mir sehr weitergeholfen.


Nachtrag: Gibt es einen Mechanismus, mit dem das Auslassen per #ifndef 
_ASSEMBLER_ schiefgehen kann?
Ich bekomme bei der Header-Datei im Anfang immer die Fehlermeldung "bad 
instruction" oder "junk at ..." für jede einzelne Zeile innerhalb des 
#ifndef(_ASSEMBLER_)-Blocks.
Angehängte Dateien:
OP #6752580
Jörg W. schrieb:
> Nur noch als Tipp: arm-none-eabi-gcc -E (plus die nötigen -D und -I
> Optionen) gibt dir das präprozessierte Ergebnis auf stdout aus.

Danke für die Erinnerung. Das nutzt man irgendwie zu selten.

Für die Assembler-Makros scheint es das nicht zu geben. (?) Da bleibt 
einem wohl nur, sich das Dissassembly anzuschauen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 5 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.