erste Schritte und Bauchklatscher

Gast #2178033
Lesenswert?

Hallo,

ich hab mal was in Assembler zusammengetackert und komme mit dem Syntax
noch nicht wirklich gut zurecht.


;I/O ports
  ldi  temp, 0xFF
  out  LEDSegmentPort-1, temp ;DDRx
  .if ( LEDCommonInvert )
    ldi  temp, 1<<LEDOuterLeft | 1<<LEDInnerLeft | 1<<LEDInnerRight | 
1<<LEDOuterRight
  .elif
    ldi  temp, 0x00
  .endif
  out  LEDCommonPort-1, temp ;DDRx


Als Fehler kommt:

error: syntax error, unexpected '\n'

und zeigt auf die Zeile .elif


Was mache ich falsch und wieso?
Gast #2178089
Lesenswert?

Hallo,

es ist der AVR Assembler und ich will für einen ATtiny3213 schreiben.

die Anwiesungen habe ich im Netz gefunden:

Assemblerdirektiven
.BYTE x    : reserviert x Bytes im Datensegment (siehe auch .DSEG)
.CSEG      : compiliert in das Code-Segment
.DB x,y,z  : Byte(s), Zeichen oder Zeichenketten einfügen (in .CSEG, 
.ESEG)
.DEF x=y   : dem Symbol x ein Register y zuweisen
.DEVICE x  : die Syntax-Prüfung für den AVR-Typ x durchführen 
(inHeaderdatei enthalten)
.DSEG      : Datensegment, nur Marken und .BYTE zulässig
.DW x,y,z  : Datenworte einfügen (.CSEG, .ESEG)
.ELIF x    : .ELSE mit zusätzlicher Bedingung x
.ELSE      : Alternativcode, wenn .IF nicht zutreffend war
.ENDIF     : schließt .IF bzw. .ELSE ab
.EQU x=y   : dem Symbol x einen festen Wert y zuweisen
.ERROR x   : erzwungener Fehler mit Fehlertext x
.ESEG     : compiliert in das EEPROM-Segment
.EXIT  : Beendet die Compilation
.IF x      : compiliert den folgenden Code, wenn Bedingung x erfüllt ist
.IFDEF x   : compiliert den Code, wenn Variable x definiert ist
.IFNDEF x  : compiliert den Code, wenn Variable x undefiniert ist
.INCLUDE x : fügt Datei "Name/Pfad" x in den Quellcode ein
.MESSAGE x : gibt die Meldung x aus
.LIST      : Schaltet die Ausgabe der List-Datei ein
.LISTMAC   : Schaltet die vollständige Ausgabe von Makrocode ein
.MACRO x   : Definition des Makros mit dem Namen x
.ENDMACRO  : Beendet die Makrodefinition (siehe auch .ENDM)
.ENDM      : Beendet die Makrodefinition (siehe auch .ENMACRO)
.NOLIST    : Schaltet die Ausgabe der List-Datei aus
.ORG x     : Setzt den CSEG-/ESEG-/DSEG-Zähler auf den Wert x
.SET x=y   : Dem Symbol x wird ein variabler Wert y zugewiesen
Gast #2178091
Lesenswert?

Hi

>du hast nicht gesagt was du für einem assembler nutzt. Sieht mir zwar
>ein wenig nach Atmel aus aber dort gibt es kein .if (zumindest kenn ich
>es dort nicht)

Du würdest dich wundern, was der/die AVR-Assembler alles können. Auch 
.if.

.elif verlangt eine Bedingung:

Syntax:
.ELIF<expression>

Für eine Alternative musst du .else benutzen.

MfDG Spess
(Firma: mayer) Persönliche Seite #2178484
Lesenswert?

> warum ist eigentlich posten ohne Anmeldung erlaubt?

das sehe ich auch so. ein anmeldung sollte notwendig sein.
das forum leidet durch solche zwischenrufer nur. was es dem einen durch 
unkompliziertes antworten - weil keine anmeldung notwendig - erleichtern 
sollte, vermiest durch solche meldungen 10 andere, hier wieder vorbei zu 
schauen.

gruss
hans
#2178510
Lesenswert?

Samuel K. schrieb:
>> Assemblerdirektiven
> Das sind eher Preprocessor-Direktiven

Man nennt diese Anweisungen in der Tat Assembler Direktiven, z.B. siehe:

http://sources.redhat.com/binutils/docs-2.12/as.info/Pseudo-Ops.html#Pseudo%20Ops

Auch wenn einige der Direktiven durch eine Art Präprozessor 
implementiert werden könnten, so habe andere Seiteneffekte, die nicht 
z.B. Textersetzung realisiert werden können. So z.B. können Symbole 
definiert oder mit Attributen versehen werden. Oder es werden 
Daten-Bytes oder -Worte in ein Segment geschrieben.
#2178516
Lesenswert?

spess53 schrieb:
> Das Forum lebt davon. Die reglemenierten Foren sind einfach nur öde.
>
> MfG Spess

Du bist ein Musterbeispiel dafür, wie der Umgang mit der freien 
Postfunktion sein sollte. Leider sieht man ständig, wie sich Leute 
extrem daneben benehmen und die sind zum großen Teil nicht angemeldet.
Deshalb bin ich eindeutig dafür das dicht zu machen. Damit könnte man, 
denke ich, außerdem die mittlere Qualität der Beiträge erhöhen.

Gruß Skriptkiddy
Gast #2178558
Lesenswert?

Bin auch blutiger Anfänger, habe aber ein Paar Ideen:

1. Wie weiter oben schon geschrieben, hinter .ELIF fehlt die Bedingung. 
Daher kommt die neue Zeile ( /n ) unerwartet. 
http://de.wikipedia.org/wiki/Escape-Sequenz

2. Die ".XXX" "Befehle sind nur für den Compiler. Diese Befehle versteht 
der Controller nicht. Sie werden jedoch während des Compilierens 
ausgewertet. Diese werden nicht in Programmcode umgesetzt, sondern 
bestimmen nur was wie compilliert wird. Eine Abfrage

;Zuweisung am Programmanfang
.EQU Wert = 8 ; Taktfrequenz 8MHz
;Verzögerung
.IF Wert = 8
    Routine für Warte 100 Takte
.ELIF Wert = 16
    Routine für Warte 200 Takte
.ENDIF
;Pause vorbei
Routine für Jetzt wird wieder in die Hände gespuckt

bewirkt KEINE Abfrage im fertigen Programm. Beim Compilieren wird die 
Variable "Wert" abgefragt und dann NUR der Programmteil übersetzt, der 
die Bedingung erfüllt.
Im obrigen Bsp. weist Du "Wert" die Taktfrequenz des Prozessors zu. 
Damit kann der Quellcode entweder für einen Prozessor mit 8MHz oder 
16MHz Quarz übersetzt werden. Die (sehr kurze) Verzögerung bleibt damit 
bei beiden Versionen zeilich gleich - vorausgesetzt die angegebene 
Taktfrequenz stimmt mit der tatsächlichen überein, das kann der Compiler 
nicht erkennen, diese Vorgabe kommt von Dir. Der positive Nebeneffekt 
ist, es werden ein paar Byte im Flash gespart.

Die Assemblercodes die der Controller versteht findest du im 
dazugehörigen Datenblatt (Nicht jeder Controller innerhalb einer Familie 
hat die gleichen Befehle)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren