Include in Assemblerdatei (.S) - wie funktionierts?

Gast #366085
Hallo zusammen,

ich schreibe einen Teil meines Programms in Assembler. Dafür benutze
ich eine ganze Datei (kein Inline-Assembler), die ich dann in mein
Programm einbinde.

Das Problem dabei ist jedoch, dass ich auf Definitionen (#define), die
in anderen eingebundenen Programmdateien stehen, zugreifen möchte. Das
klappt aber offensichtlich so einfach nicht, es kommt ein Schwall von
Fehlermeldungen (unknown opcode typedef; unknown opcode void).

Ich binde die Dateien ganz normal mit '#include <main.h>' ein. Wieso
funktioniert das nicht? Wie muss es denn richtig lauten?

Grüsse,
Steffen
Gast
Das GCC-Tutorial hier auf der Seite habe ich mir schon angeschaut. Dort
wird aber lediglich von

#include "avr/io.h"

gebrauch gemacht. Das hab ich bei mir auch so in der Assemblerdatei
stehen und funktioniert soweit auch. Nur wenn ich beispielsweise ein

#include "main.h"

einfüge, gibt er mir Fehlermeldungen noch und nöcher. Und ich habe -
ehrlich gesagt - keine Idee, warum. Kannst Du mir weiterhelfen?
Gast
In der Assemblerdatei von Peter Fleury wird lediglich "avr/io.h"
eingebunden. Leider keine andere Datei und deshalb hilft es mir auch
nicht weiter, denn "avr/io.h" kann ich bei mir auch ohne Probleme
einbinden.

Mal von vorne: es geht im Prinzip darum, dass ich Definitionen aus
anderen Headerdateien benutzen muss (Registerdefinitionen eines
CAN-Controllers, die ich nicht nocheinmal alle abschreiben möchte) und
benutzen möchte (Parameter aus Main.h).

Also schreibe ich in meiner Assemblerdatei etwa (Auszug):

...
#include "mcp2515.h"
...


Die Datei mcp2515.h sieht dabei wie folgt aus:

#ifndef _MCP2515
#define _MCP2515

/* Dateien einbinden */
#include <inttypes.h>      // Int-Typen einfügen
#include <avr/interrupt.h>    // Interrupt-Header einfügen
#include <spi.h>      // SPI-Busroutinen einfügen

/* Funktionsprototypen */
void MCP2515_Reset(void);    // Resettet den MCP2515
uint8_t MCP2515_Read(uint8_t);    // Liest ein Byte aus dem MCP2515
void MCP2515_Write(uint8_t, uint8_t);  // Schreibt ein Byte im MCP2515
void MCP2515_RTS(uint8_t Buffer);  // Sendet ein "RTS" an den MCP2515
uint8_t MCP2515_Status(void);    // Liest den Status des MCP2515
void MCP2515_Modify(uint8_t Address, uint8_t Mask, \
    uint8_t Data);    // Modifiziert ein Byte im MCP2515

/* Makros */
#define HIGH(Word) Word>>8    // Nur High-Teil eines 16-Bit Worts
verarbeiten
#define LOW(Word) Word&0x00FF    // Nur Low-Teil eines 16-Bit Worts
verarbeiten

/* Registerdefinitionen */
// Definition des MCP2515 von Lieven Hollevoet, boostc compiler, siehe
// http://creativecommons.org/licenses/by-sa/2.0/

// Register map of the MCP2515
#define RXF0SIDH  0x00
#define RXF0SIDL  0x01
...

#endif


Die Fehler, die dann auftreten, habe ich ja schon in meinem ersten
Posting erwähnt (unknown opcode)...
Und ich denke immer noch, dass dein Assembler
nicht wirklich glücklich damit ist, wenn du ihm
C-Syntax vorwirfst.
Es mag zwar eine gewisse Überschneidung geben, zwischen
dem was der Assembler syntaktisch verarbeiten kann und
dem was der C-Compiler kann. Aber 100% wird das nie sein.

Der Assembler, wird mit einem 'void' genausowenig
anfangen können wie mit einem 'typedef'.

Wenn es dir nur darum geht, die
#define
in den Assembler reinzukriegen, dann extrahiere die in
ein eigenes H-File, die sowohl von main.h als auch
von deinem Assembler-File inkludiert wird.
Gast
Ja, das was Du da schreibst klingt logisch. Er ruft die
#include-Funktionalität ja von der Assemblerdatei aus... ok.

Aber gibt es nun wirklich keine elegantere Lösung, als die alle
mcp2515-spezifischen Definitionen in eine allgemeine Header-Datei zu
schreiben? Ich hätte sie nämlich lieber dort stehen, wo sie hingehören
;-)

Aber ok, ich bin erstmal beruhigt, eine Erklärung gefunden zu haben.
Danke!
Gast
für Assembler gibt es solche Dateien meist auch, die Endung ist dann oft
'.inc'. Suche mal nach solchen Dateien in deiner Entwicklungsumgebung.
Ich kenne die mcp's nicht, bei AVR's ist das aber so.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 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.