Forum: Mikrocontroller und Digitale Elektronik Macros in AVR Assembler


von Wolfram Q. (quehl)


Lesenswert?

ich habe festgestellt, daß man fehlende Anweisungen in Macros ergänzen 
kann wie im Beispiel ADDI. Jedoch kann man unlogische Anweisungen nicht 
in den Macros verändern wie im Beispiel SBR. Der Assembler sieht dann 
wohl erst dann in den Macros nach, wenn er die Anweisung nicht findet. 
Schöner wäre es, wenn die Macros eine höhere Priorität hätten und zuerst 
dort nachgesehen würde.
Unlogisch ist es, wenn die Parameter beim Setzen eines Bits im Register 
anders sind als beim Setzen eines Bits im I/O Register. Beim Setzen 
eines Bits im Register mit SBR muß das 1<< immer geschrieben werden, da 
gibt es keine Wahlmöglichkeit. Sowas sollte es in Assembler nicht geben.

 .MACRO ADDI    ; Addieren Sofort
    subi @0,-@1
 .ENDMACRO

 .MACRO sbr
    sbr @0,1<<@1
 .ENDMACRO

Bei der Anweisung CLS gibt der ATMEGA32 keine Fehlermeldung aus, obwohl 
diese Anweisung nicht in der Hilfe Datei enthalten ist.

Kann jemand diese Mängel in Englisch übersetzen und an Atmel senden?

mfg

von Johannes M. (johnny-m)


Lesenswert?

> Bei der Anweisung CLS gibt der ATMEGA32 keine Fehlermeldung aus, obwohl
> diese Anweisung nicht in der Hilfe Datei enthalten ist.
In welcher Hilfe-Datei hast Du denn nachgesehen? Bei mir gibt es CLS 
sehr wohl...

von Johannes M. (johnny-m)


Lesenswert?

> ...Setzen eines Bits im Register
> anders sind als beim Setzen eines Bits im I/O Register...
sbr  cbr und sbi  cbi sind zwei völlig unterschiedliche Befehlspaare, 
die völlig unterschiedlich funktionieren. sbi / cbi kann immer nur ein 
einzelnes Bit in einem I/O-Register verwursten. Da wird dementsprechend 
die Nummer des Bits angegeben. sbr / cbr hingegen kann auf alle Bits in 
einem Rechenregister gleichzeitig zugreifen! Dafür muss allerdings eine 
Maske angegeben werden. sbr ist nur eine andere Schreibweise von ori und 
cbi eine andere Schreibweise von andi mit dem Komplement der Maske. 
Schau Dir einfach mal den Opcode der Befehle an, und Du wirst sehen, 
dass die tatsächlich identisch sind. Das ist kein Mangel am Assembler, 
sondern eher ein Mangel an Verständnis Deinerseits...;-)

ATMEL hätte sbr / cbr auch aus dem Befehlssatz herauslassen können, da 
es eben eigentlich keine eigenständigen Befehle sind. In dem Falle 
müsstest Du anstelle von "sbr Rd, k" immer "ori Rd, k" schreiben und bei 
"cbi Rd, k" wäre das "andi Rd, ~k". Das cbi nimmt Dir sogar noch das 
Invertieren der Maske mit ab. Sei doch froh, dass ATMEL Dir die Arbeit 
leichter macht...

von Wolfram Q. (quehl)


Lesenswert?

meine Hilfe Datei ist wohl schon etwas älter. Stammt aus der nicht 
funktionsfähigen Installation von Studio 4.11 . Und nur um einzelne 
Dateien upzudaten, ist eine Installation nicht gerade angebracht. Wenn 
ich mal davon absehe, daß ich mit einem Modem 70MB runterladen soll, nur 
um den Assembler und die Hilfe Datei zu aktualisieren.
Kannst Du mir den neuen Assembler und die Hilfe Datei zusenden? ( quehl 
ett gmx punkt de )

Mit dem SBR hast Du mich falsch verstanden. Es geht nicht um die 
Anweisung selber, die ist schon nützlich, sondern um die unterschiedl. 
Handhabung zwischen Registern und I/O Registern. Wenn man dann noch 
bedenkt, daß I/O Anweisungen auch durch Registerbefehle angesprochen 
werden können, dann kann ich die unterschiedl. Handhabung nicht 
verstehen. Zwischen SBR und SBI.

Warum soll ich nicht mit SBR ein einzelnes Bit setzen dürfen, wenn das 
mit SBI auch geht.

mfg

von Johannes M. (johnny-m)


Lesenswert?

Wolfram Quehl wrote:
> Mit dem SBR hast Du mich falsch verstanden. Es geht nicht um die
> Anweisung selber, die ist schon nützlich, sondern um die unterschiedl.
> Handhabung zwischen Registern und I/O Registern. Wenn man dann noch
> bedenkt, daß I/O Anweisungen auch durch Registerbefehle angesprochen
> werden können, dann kann ich die unterschiedl. Handhabung nicht
> verstehen. Zwischen SBR und SBI.
>
> Warum soll ich nicht mit SBR ein einzelnes Bit setzen dürfen, wenn das
> mit SBI auch geht.
Ich denke nicht, dass ich Dich da falsch verstanden habe. 
Selbstverständlich kannst Du mit sbr ein einzelnes Bit in einem Register 
setzen. Da der Befehl sbr aber auch alle Bits eines Registers 
gleichzeitig setzen kann, ist die Syntax eine andere. sbi/cbi sind 
"echte" Assembler-Befehle, die im Befehlssatz des Controllers 
existieren. Das tun sbr und cbr nicht. Im Grunde genommen sind das nur 
eine Art im Assembler "fest eingebaute Makros" und keine eigenständigen 
Befehle. Sie sind nur dazu da, um ein Programm lesbarer zu machen.

Es gibt im Befehlssatz nunmal keinen dem sbi/cbi entsprechenden Befehl 
zum Setzen eines einzelnen Bits in einem Rechenregister. Und da kannst 
Du Dich noch so sehr bei ATMEL beschweren, die werden daran sicher 
nichts ändern. Wenn Du versuchst, mit einem Makro einen existierenden 
Befehl zu redefinieren, dann ist es verständlich, wenn der Assembler das 
nicht mit sich machen lassen will.

Du musst auch verstehen, dass man den AVR-Befehlssatz so entwickelt hat, 
dass bis auf wenige Ausnahmen alle Befehle 16 Bit lang sind. Und da ist 
nunmal nicht viel Spielraum für Adressen. Deshalb können z.B. alle 
Befehle, die mit immediate-Werten arbeiten (also auch sbr und cbr), nur 
mit den oberen 16 Rechenregistern arbeiten, weil neben dem 
8-Bit-immediate-Wert noch die Adresse des Registers im Befehl 
untergebracht werden muss. Und dann bleibt für den eigentlichen Befehl 
nicht mehr viel Platz.

von Winfried (Gast)


Lesenswert?

Man muss auch immer sehen, dass Assembleranweisungen selten dahin 
optimiert sind, möglichst ideal den Programmierer zu erfreuen. Es ist 
immer ein Kompromiss, wie man es technisch einfach hinbekommt und wie 
die Kosten des Chips möglichst gering werden. Aus Programmierersicht 
könnte man vieles viel besser machen, wie viele haben z.B. schon über 
die Architektur und die wenigen Befehle des PIC's geflucht. Dafür waren 
die aber auch über viele Jahre unschlagbar günstig. Und irgendwann lernt 
man die Gehirn-Akrobatik, mit den Merkwürdigkeiten klar zu kommen.

Das man beim AVR manchmal ein Bit anspricht und manchmal eine Maske 
übergibt, finde ich auch etwas unschön und da bin ich auch öfters 
schonmal drüber gestolpert.

von Johannes M. (johnny-m)


Lesenswert?

Winfried wrote:
> Man muss auch immer sehen, dass Assembleranweisungen selten dahin
> optimiert sind, möglichst ideal den Programmierer zu erfreuen. Es ist
> immer ein Kompromiss, wie man es technisch einfach hinbekommt und wie
> die Kosten des Chips möglichst gering werden.
Naja, der AVR ist nunmal ein RISC. Und RISC bedeutet eben im Gegensatz 
zu CISC (Complex Instruction Set Computer) Reduced Instruction Set 
Computer. Und ein wichtiger Gesichtspunkt der "Philosophie" einer 
RISC-Architektur ist es, einen Befehlssatz zu haben, dessen Anweisungen 
möglichst gleich lang (bzw. eher gleich kurz) sind und die im Großen und 
Ganzen in einem Taktzyklus abgearbeitet werden können. Durch die 
vorgegebene Kürze der Befehle ergibt sich auch eine Einschränkung der 
Anzahl der Befehle. Man hat eben einige sehr grundlegende Funktionen zur 
Verfügung, aus denen man durch Kombination komplexere Operationen 
zusammenbauen kann.

ATMEL hat bei der Entwicklung des Assemblers bereits einige Mnemonics 
ähnlich wie sbr/cbr eingebaut, die die Programme lesbarer machen sollen, 
ohne dass der Programmierer erst zig Makros schreiben muss. Ungefähr ein 
Drittel des AVR-Befehlssatzes sind solche "Pseudo-Befehle", die 
lediglich andere Schreibweisen für bestimmte Befehle darstellen. So gibt 
es z.B. auf "Maschinenebene" nur zwei Branch-Befehle (nämlich brbc und 
brbs). Alle anderen 18 brXX-Befehle sind von diesen beiden abgeleitet, 
indem einer der Operanden bereits vorgegeben ist und nur noch das 
Sprungziel angegeben werden muss. Warum ATMEL allerdings ein addi 
"vergessen" hat, weiß ich auch nicht...

> Aus Programmierersicht
> könnte man vieles viel besser machen, wie viele haben z.B. schon über
> die Architektur und die wenigen Befehle des PIC's geflucht. Dafür waren
> die aber auch über viele Jahre unschlagbar günstig. Und irgendwann lernt
> man die Gehirn-Akrobatik, mit den Merkwürdigkeiten klar zu kommen.
Und für die PICs gilt afaik ähnliches. Ich habe mit ST6 meine ersten 
µC-Schritte gemacht. Wenn ich mich recht entsinne, gibts da nicht mal 40 
Mnemonics (AVR-Assembler hat mehr als dreimal so viele, hauptsächlich 
durch die "Pseudo-Instruktionen").

> Das man beim AVR manchmal ein Bit anspricht und manchmal eine Maske
> übergibt, finde ich auch etwas unschön und da bin ich auch öfters
> schonmal drüber gestolpert.
Es ist richtig, dass das eine Stolperfalle sein kann. Aber man kann eben 
nicht alles haben...;-)

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

addi ist wirklich "doof" das es das nicht gibt aber man hat ja subi ;)

von Johannes M. (johnny-m)


Lesenswert?

@Läubi:
Wolfram hat das addi-Makro oben ja schon angegeben. Ich finde allerdings 
die Übersetzung von "immediate" funny...

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.