mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Makros im AVR Assembler


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mich jetzt neu eingearbeitet in Assembler, da ich das für die 
Firma brauche.
Ich bin neulich auf die Makros gestoßen und habe festgestellt, dass das 
Makro .equ sehr oft verwendet wird, jetzt habe ich mich näher damit 
beschäftigt und habe folgende Beschreibung gefunden:

.EQU: Defines a symbol and sets its value (later changes of this value 
remain possible, syntax: .EQU test = 1234567, internal storage of the 
value is 4-byte- Integer)

Heißt das, dass ich hier 4Bytes reinschreiben kann?

kann ich auch nur zB 1 Byte verwenden und dann auf Ports ausgeben oder 
müssen es 4 Byte sein?

Gibt es für jedes .equ im Programm 4 Byte? Wenn ja, kann man damit den 
Speicher vollschreiben?

Und dann habe ich auch gesehen, dass man IF Bedingungen stellen kann.
Und darunter steht dann, dass alle Makros in Wirklichkeit keinen Code 
produzieren, was soll das eigentlich heißen? Heißt das, ich kann kein 
Programm oder ein Problem mit Makros lösen?

Grüße Peter

Autor: Jonas F. (wuschelkuchen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreibst du
.EQU test = 1234
wird überall im restlichen Programm, wo test vorkommt, dieses vom 
Assembler durch 1234 ersetzt. Damit wird auch kein Programmcode im 
eigentlichen Sinne erzeugt. D.h. du kannst da theoretisch reinschreiben, 
was du willst, es müssen keine 4 Byte sein.

grüssse
w.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.equ ist kein Macro, sondern eine Assembler-Direktive.  Es weist einem 
Symbol einen Wert zu.  Später kannst Du statt dieses Wertes das Symbol 
hinschreiben.

Es erzeugt keinen Code, also kannst Du damit auch nicht den Speicher 
vollschreiben.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Und dann habe ich auch gesehen, dass man IF Bedingungen stellen kann.

Ja.

>Und darunter steht dann, dass alle Makros in Wirklichkeit keinen Code
>produzieren, was soll das eigentlich heißen? Heißt das, ich kann kein
>Programm oder ein Problem mit Makros lösen?

Selbsverständlich erzeugen Makros Code. Wenn sie benutzt werden. Das 
Schreiben eines Makros erzeugt allerdings noch keinen Code.

MfG Spess

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was das IF anbelangt: damit erzeugst Du nicht im späteren Code eine 
Wenn-Bedingung.  Sondern es ist ebenfalls eine Direktive, diesmal zur 
bedingten Assemblierung.  Hiermit bestimmst Du zur Assemblierzeit, was 
von deinem Quellcode berücksichtigt wird.

Eine Beispielanwendung wäre:  Du hast ein Programm, von dem es zwei 
Versionen geben soll.  einmal soll es auf dem Display ausgeben und 
einmal auf der seriellen Schnittstelle.  Du möchtest also aus demselben 
Quellcode zwei verschiedene Object-Codes erzeugen können.  Oder dasselbe 
Programm soll auf zwei oder mehr verschiedenen µC derselben Familie 
laufen.

Die Teile, die unterschiedlich sind, kapselst Du in IF-Direktiven ein. 
Vor dem Übersetzen musst Du dann nur ein .equ ändern, und schon wird die 
gewünschte Version erzeugt.

Übrigens: Die IF-Syntax ist (wie die von equ) zwischen den verschiedenen 
Assemblern unterschiedlich.  Es muss nicht mal beides vorhanden sein.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber was hat das für einen Sinn wenn ich .equ TT = 6597 hinschreibe, 
wenn der Prozessor nur ein 8 Bit Prozessor ist und mehr als 8 Bit nur 
über 2 Register gehen?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Aber was hat das für einen Sinn wenn ich .equ TT = 6597 hinschreibe,
>wenn der Prozessor nur ein 8 Bit Prozessor ist und mehr als 8 Bit nur
>über 2 Register gehen?

Beispiel:
.equ TT = 6597

ldi XL, Low(TT)
ldi XH,High(TT)

MfG Spess

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es kommt durchaus häufig vor, dass mal Zahlen hat, die größer als 255 
sind und denen man einen aufschlussreichen Namen geben will.  Natürlich 
kannst Du die nicht in ein einziges Register schreiben.  Aber der 
Assembler verfügt über genügend mathematischen Funktionen, um sie sich 
später so zurecht zu biegen wie man sie braucht, z.B. um sie in High und 
Low Byte aufzuteilen.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hc Zimmerer schrieb:
> Eine Beispielanwendung wäre:  Du hast ein Programm, von dem es zwei
> Versionen geben soll.  einmal soll es auf dem Display ausgeben und
> einmal auf der seriellen Schnittstelle.  Du möchtest also aus demselben
> Quellcode zwei verschiedene Object-Codes erzeugen können.  Oder dasselbe
> Programm soll auf zwei oder mehr verschiedenen µC derselben Familie
> laufen.
>
> Die Teile, die unterschiedlich sind, kapselst Du in IF-Direktiven ein.
> Vor dem Übersetzen musst Du dann nur ein .equ ändern, und schon wird die
> gewünschte Version erzeugt.

Wenn ich jedoch alle Programme in einem File schreibe, dann wird doch 
das ganze erst recht unübersichtlich oder?

Dann hätte ich zB:

.equ Version = Wert

.if Version = 1
//Progamm Version 1
.
.
.
.endif

.if Version = 2
//Progamm Version 2
.
.
.
.endif

Dann habe ich 2 Versionen in einem Programm.
PS: Danke für die bisherigen guten Tipps!

Grüße Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.