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
Die relevanten Befehle sind:
Befehl | Parameter | Erklärung |
---|---|---|
SBI |
Port, Bit | set Bit in Port-Register |
CBI |
Port, Bit | clear Bit in Port-Register |
NOP |
no operation | |
LDI * |
Register, Konstante | Konstante in Register laden (load immediately) |
LD |
Register, Konstante | Konstante in Register laden |
DEC |
Register | Register um 1 kleiner machen |
Marke: |
markiert Stelle im Code | |
RJMP |
Marke | springt zu Marke |
BRNE |
Marke | springt zu Marke wenn Z-Flag = 0 |
IN |
Register, Port | lädt Register auf einen Port |
OUT |
Port, Register | lädt Port in ein Register |
PUSH |
Register | Lädt Register auf den Stack |
POP |
Register | Holt Register vom Stack |
ADD |
Register, Register | Register 1 = Register 1 + Register 2 |
SUB |
Register, Register | Register 1 = Register 1 - Register 2 |
INC |
Register | das Register wird um 1 erhöht |
DEC |
Register | das 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:
Element | Erklärung |
---|---|
; |
alles hinter dem ; wird ignoriert (Kommentar) |
.include |
Einbinden einer Datei mit Konstanten, usw. |
.equ |
Setzen einer Konstanten |
.set |
Setzen einer Variable |
.def |
ein Register wird einem symbolischen Wert zugeordnet |
.org |
setzt 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:
Funktion | Erklä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:
Operation | Erklä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:
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.