Forum: Mikrocontroller und Digitale Elektronik PIC Assembler : #define in header und main


von exone (Gast)


Lesenswert?

Hallo,

ich habe hier ein kleines Programm, das in Assembler geschrieben ist.
In der Header Datei steht  #define STAT PORTB,5
und in der source File also der main steht nochmals #define OUT PORTB,5.
Wie ihr seht ist mein PORTB,5 nun mit zwei verschiedenen Variablen 
belegt.
Das Programm lässt sich aber ohne Probleme kompalieren. Welche Variabel 
wird denn nun auf den PORTB,5 sozusagen übertragen ? Oder kann ich nun 
beides anstatt PORTB,5 schreiben ?

von Jim M. (turboj)


Lesenswert?

Kauf Dir ein C-Buch, das den Präprozessor beschreibt. Dir fehlt 
wichtiges Grundlagenwissen.

Das sind Präprozessormacros und keine Variablen.

von Karl H. (kbuchegg)


Lesenswert?

exone schrieb:
> Hallo,
>
> ich habe hier ein kleines Programm, das in Assembler geschrieben ist.

Sicher?
#define ist ein Begriff aus der C Welt. Allerdings spricht auch nichts 
dagegen, dass der Erfinder deines Assemblers die Syntax übernommen hat

> In der Header Datei steht  #define STAT PORTB,5

Schön.
Wenn ich mal C-Regeln anwende, dann steht da:
überall dort, wo in weiterer Folge der Text 'STAT' auftaucht, ersetze 
den Text 'STAT' mit dem Text 'PORTB,5'

> und in der source File also der main steht nochmals #define OUT PORTB,5.

OK.
Also noch eine Vereinbarung:
Überall, wo in weiterer Folge der Text 'OUT' auftaucht, ersetzte den 
Text 'OUT' durch den Text 'PORTB,5'

> Wie ihr seht ist mein PORTB,5 nun mit zwei verschiedenen Variablen
> belegt.

Nö.
#define vereinbart einfach nur Textersetzungen. So wie du in deinem 
Editor einen Menüpunkt hast 'Text suchen und ersetzen'. Ein #define ist 
im Grunde nicht viel mehr, nur dass trickreicherweise die 
Textersetzungsoperation in den Text selbst eingebettet ist.
Mit Variablen hat das alles überhaupt nichts zu tun.

> Das Programm lässt sich aber ohne Probleme kompalieren. Welche Variabel
> wird denn nun auf den PORTB,5 sozusagen übertragen ?

Da wird überhaupt nichts 'übertragen'.
Du kannst ja auch zu deiner Freundin Anita 'Schatzi' und wahlweise 
'Hasi' sagen
1
#define SCHATZI  Anita
2
#define HASI     Anita
Die 'Prozessorin', die eine von dir gemachte Wortspende bearbeitet, 
ersetzt dann intern für sich jedes 'SCHATZI' mit 'Anita' und auch jedes 
'HASI' mit 'Anita' ehe dann der Bearbeitungsprozess losgeht, der einem 
'SCHATZI hol bitte Bier' eine Bedeutung zuweist. Zuerst wird die 
Textersetzung gemacht, durch die SCHATZI durch Anita ersetzt wird, 
wodurch aus dem von dir abgegebenem Satz ein 'Anita hol bitte Bier 
wird'. Und erst dann entscheidet die Bearbeiterin, ob der Satz Sinn 
ergibt und was damit zu machen ist.

von GroberKlotz (Gast)


Lesenswert?

Hallo exone,
Dass es ganz klar rüberkommt: mit #define kannst Du Deinen Assemblercode 
viel besser lesbar machen!
Z.B. "bsf PORTB,5" oder "bcf PORTB,5" sagt zunächst nicht sonderlich 
viel über die dahinter verborgene Funktion des Befehls aus. Sobald Du 
aber am Beginn Deines Programms dies einfügst:
1
#define LED_EIN    bsf PORTB,5
2
#define LED_AUS    bcf PORTB,5
brauchst Du z.B im nachfolgenden Code nur noch zu schreiben
1
LED_EIN 
2
LED_AUS
Die Ersetzung der Label mit Assemblercode "bsf PORTB,5" oder "bcf 
PORTB,5" erfolgt dann wie vom Karl Heinz beschrieben beim assemblieren. 
Du weißt auch noch nach Jahren auf den ersten Blick in den Quellcode 
(das *.ASM-File) was Du damals beim programmieren verwirklicht/gedacht 
hast.

mfG GroberKlotz

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.