Hauptseite Zu yanwittmann.de

Zur Hauptseite

<     1. Assembler     >

Bitte Warnung ganz unten lesen!

Hardware >> Microcontroller


Assembler ist eine (die allererste!) Programmiersprache, die von einem Programm names 'Assemblierer' in Maschinensprache übersetzt (kompiliert) wird, also zu tatsächlichen Einsen und Nullen gemacht wird. Sie arbeitet fast nur mit den Anweisungen, die dann später tatsächlich von der CPU ausgeführt werden und kommt ohne die Konstrukte der höheren Sprachen aus, also keine Schleifen, Klassen, Objekte, Methoden, usw.
Zwar sind mit Assembler dadurch sehr viel effizientere Programme möglich, doch dafür ist es auch sehr viel umständlicher zu schreiben und zu lernen. Ebenso wird der Code schwerer zu lesen und zu warten.
Heutzutage wird Assembler hauptsächlich auf Mikrocontrollern eingesetzt, da diese eine niedrigere Leistung haben und somit die Ausführungsgeschwindigkeit im Gegensatz zu PCs ein nicht zu verachtender Faktor wird.
Code, der in Assembler geschrieben ist, folgt eigentlich immer diesem Muster:
Befehl parameter1, parameter2


Anweisungen

Die relevanten Befehle sind:

                                                                                                                                                                                                                                                                                                                                                                                         
BefehlParameterErklärung
SBIPort, Bitset Bit in Port-Register
CBIPort, Bitclear Bit in Port-Register
NOPno operation
LDI *Register, KonstanteKonstante in Register laden (load immediately)
LDRegister, KonstanteKonstante in Register laden
DECRegisterRegister um 1 kleiner machen
Marke:markiert Stelle im Code
RJMPMarkespringt zu Marke
BRNEMarkespringt zu Marke wenn Z-Flag = 0
INRegister, Portlädt Register auf einen Port
OUTPort, Registerlädt Port in ein Register
PUSHRegisterLädt Register auf den Stack
POPRegisterHolt Register vom Stack
ADDRegister, RegisterRegister 1 = Register 1 + Register 2
SUBRegister, RegisterRegister 1 = Register 1 - Register 2
INCRegisterdas Register wird um 1 erhöht
DECRegisterdas Register wird um 1 verringert

Befehle, die mit einem * markiert sind, dürfen nicht auf die Register 0-15 angewandt werden. (siehe Register)
Befehle, die mit Interrupts zu tun haben, werden bei später bei Interrupts / Polling genannt.
Die jeweils benötigten Ausführungszyklen und mehr Details können in der lokalen Formelsammlung gefunden werden.

Es gibt einige Direktiven, die nicht als Assembler-Code kompiliert werden:

                                                                                                               
ElementErklärung
;alles hinter dem ; wird ignoriert (Kommentar)
.includeEinbinden einer Datei mit Konstanten, usw.
.equSetzen einer Konstanten
.setSetzen einer Variable
.defein Register wird einem symbolischen Wert zugeordnet
.orgsetzt die Adresse im Programmspeicher, bei der als nächstes der assemblierte Code geschrieben werden soll. Vor allem nützlich zum Erstellen der Interruptvektortabelle.

Doch gibt es auch einige ‘höhere’ Funktionen, auch, wenn es nicht viele sind. Hier sind die wichtigsten von diesen:

                                                                               
FunktionErklärung
LOW( Register )liefert Bits 0-7 eines 16-Bit Registers
HIGH( Register )liefert Bits 8-15 eines 16-Bit Registers
EXP2( Ausdruck )wendet 2Ausdruck an
LOG2( Ausdruck )wendet log2(Ausdruck) an

Um Werte zu verarbeiten, gibt es die Bitoperationen:

                                                                               
OperationErklärung
>> und <<rechts- und links- Shift. Schiebt alle Bits nach rechts/links und füllt je mit 0 auf
|bitweise oder
&bitweise und
bitweise exklusives oder

Diese drei Zeilen z.B. machen dasselbe:

ldi temp, (1<<3) | (1<<1) | (1<<2) | (1<<0)          
ldi temp, 8 | 2 | 4 | 1
ldi temp, 15
Assembler



Warnung:

Diese Seite entspricht noch nicht den Ansprüchen, die wir für diese Website haben.
Grund: Es wird nicht tief genug in das Thema eingegangen.
Falls du eine Idee hast, wie man dieses Problem beheben könnte, kontaktiere uns bitte über den Link Hilf mit! in der grauen Footer-Leiste unten.