(→Der Zentral-Prozessor (CPU)) |
|||
Zeile 13: | Zeile 13: | ||
Die Nachteile: | Die Nachteile: | ||
*Gott-weiß-wie komfortabel ist der Bascom-Assembler natürlich nicht, aber es reicht. | *Gott-weiß-wie komfortabel ist der Bascom-Assembler natürlich nicht, aber es reicht. | ||
+ | *Bei manchen Befehlen ist es nicht klar, ob das ein Assembler oder ein Bascom-Befehl ist. In diesem Fall muß man ein "!" rufzeichen davor setzen. Man erkennt das aber sofort, denn diese reservierten Bascom-Wort mach er sofort in Fettschrift. trotzdem aufpassen ! | ||
+ | |||
==Ein Grund-Programm== | ==Ein Grund-Programm== | ||
Zeile 50: | Zeile 52: | ||
*Arithmetisch | *Arithmetisch | ||
ADD R25, R24 addieren R25 + R24, Ergebnis nach R25 | ADD R25, R24 addieren R25 + R24, Ergebnis nach R25 | ||
− | SUB R25, R24 subtrahieren | + | !SUB R25, R24 subtrahieren |
*Logisch | *Logisch | ||
− | AND R25, R24 "UND" | + | !AND R25, R24 "UND" |
− | OR R25, R24 "ODER" | + | !OR R25, R24 "ODER" |
EOR R25, R24 "Exklusiv-ODER" | EOR R25, R24 "Exklusiv-ODER" | ||
Zeile 69: | Zeile 71: | ||
LDI R25, 17 'Nachladen, da R25 durch "ADD" ja verändert wurde | LDI R25, 17 'Nachladen, da R25 durch "ADD" ja verändert wurde | ||
− | SUB R25, R24 'subtrahieren 17 - 14 | + | !SUB R25, R24 'subtrahieren 17 - 14 |
LDI R25, 17 ' Laden | LDI R25, 17 ' Laden | ||
LDI R24, 14 ' Laden | LDI R24, 14 ' Laden | ||
− | AND R25, R24 ' Es kommt überall dort "1" raus, wo sowohl r25 als auch R24 eine 1 haben | + | !AND R25, R24 ' Es kommt überall dort "1" raus, wo sowohl r25 als auch R24 eine 1 haben |
LDI R25, 17 ' Laden | LDI R25, 17 ' Laden | ||
LDI R24, 14 ' Laden | LDI R24, 14 ' Laden | ||
− | OR R25, R24 ' Es kommt überall dort "1" raus, wo r25 oder R24 eine 1 haben | + | !OR R25, R24 ' Es kommt überall dort "1" raus, wo r25 oder R24 eine 1 haben |
' (ODER BEIDE !) | ' (ODER BEIDE !) | ||
Zeile 107: | Zeile 109: | ||
LDI R25, 17 | LDI R25, 17 | ||
LDI R24, 14 | LDI R24, 14 | ||
− | SUB R25, R24 | + | !SUB R25, R24 |
</pre> | </pre> | ||
Zero & Carry sind nicht gesetzt, denn das Ergebnis ist ungleich NULL, und "17" ist außerdem größer als "14" | Zero & Carry sind nicht gesetzt, denn das Ergebnis ist ungleich NULL, und "17" ist außerdem größer als "14" | ||
Zeile 113: | Zeile 115: | ||
LDI R25, 17 | LDI R25, 17 | ||
LDI R24, 17 | LDI R24, 17 | ||
− | SUB R25, R24 | + | !SUB R25, R24 |
</pre> | </pre> | ||
Jetzt ist Zero gesetzt, denn das Ergebnis ist gleich NULL | Jetzt ist Zero gesetzt, denn das Ergebnis ist gleich NULL | ||
Zeile 119: | Zeile 121: | ||
LDI R25, 12 | LDI R25, 12 | ||
LDI R24, 44 | LDI R24, 44 | ||
− | SUB R25, R24 | + | !SUB R25, R24 |
</pre> | </pre> | ||
Jetzt ist das Carry-Bit gesetzt, denn "12" ist ja kleiner als "44", das Ergebnis ist also negativ | Jetzt ist das Carry-Bit gesetzt, denn "12" ist ja kleiner als "44", das Ergebnis ist also negativ |
Version vom 27. Juni 2006, 16:09 Uhr
Was hier folgt, ist nichts für Profis und Power-User, die mögen weiterblättern. Ich versuche hier, absolute Neueinsteiger nach und nach mit ein paar Grundinformationen zu versorgen.
Inhaltsverzeichnis
Assembler Einführung für Bascom-User
Wieso Bascom ?
Eine der einfachsten Möglichkeiten, sich an Assembler heranzutasten, ist es, den Bascom-Compiler als Workbench zu benutzen.
Die Vorteile:
- Das Drumherum mit der richtigen Initialisierung, auch der Perpipherie, kann man bequem von Bascom machen lassen, bis man sich halt auskennt.
- Wenn irgendeine Berechnung oder Teil-Funktion nervt oder nicht gleich richtig hinhaut, schreibt man halt doch ein paar Bascom-Statements.
- fürs Erste reicht die Demo-Version allemal
Die Nachteile:
- Gott-weiß-wie komfortabel ist der Bascom-Assembler natürlich nicht, aber es reicht.
- Bei manchen Befehlen ist es nicht klar, ob das ein Assembler oder ein Bascom-Befehl ist. In diesem Fall muß man ein "!" rufzeichen davor setzen. Man erkennt das aber sofort, denn diese reservierten Bascom-Wort mach er sofort in Fettschrift. trotzdem aufpassen !
Ein Grund-Programm
Auch das ist ein Bascom-Programm:
$regfile = "m32def.dat" $asm $end Asm End
Das Programm macht natürlich überhaupt nix. Aber durch die paar Zeilen hat Bascom alle notwendigen Initialisierungen schon erledigt und wir brauchen uns um nichts zu kümmern. Zwischen "$asm" und "$end asm" kann man nun nach Herzenslust irgendwas Assemblermäßiges reinschreiben und mit dem Simulator rumprobieren.
Auch "REGFILE" müßte man nicht hinschreiben, dann gilt eben das, was man in "OPTIONS/COMPILER/CHIP" eingestellt hat.
Der Zentral-Prozessor (CPU)
Das ist der Kollege, dem man mit "Assembler-Instruktionen" davon überzeugen muß, irgendwas zu tun. Ohne den läuft garnix. Der hat als Hilfe einen "Befehlszähler", der immer auf den nächsten Befehl zeigt, der drankommt. Und dann hat er noch eine Reihe "Register", das sind kleine Zwischenspeicher, mit denen er arbeiten kann. Die heissen einfach "R0", "R1",...."R31", also 32 Stück, in jedes paßt genau ein Byte, und ein Byte, das wissen wir, besteht wiederum aus 8 Bits.
Daten-Transfer Operationen I
Bevor wir mit diesen Registern irgendetwas ausprobieren können, müssen wir erstmal gezielt bestimmte Werte reinschreiben können. Sowas heißt eben "Transfer". Da wir ja erst am Anfang sind, reicht uns zum Beispiel der Befehl:
LDI R24, 14
Damit wird in das Register R24 der Binärwert von "14" reingestellt, das sind die Bits "00001110". Der maximale Wert, da es ja nur ein Byte ist, wäre "255", also "11111111". Für den Befehl "LDI" können wir übrigens leider nur die Register R16 - R31 setzen, das ist so eine Einschränkung von wegen "RISC" Architektur.
Arithmetisch-Logische Operationen
Laden wir mal zwei Register:
LDI R25, 17 LDI R24, 14
Und jetzt die Grund-Befehle, Varianten später:
- Arithmetisch
ADD R25, R24 addieren R25 + R24, Ergebnis nach R25 !SUB R25, R24 subtrahieren
- Logisch
!AND R25, R24 "UND" !OR R25, R24 "ODER" EOR R25, R24 "Exklusiv-ODER"
Das Ergebnis steht immer in Operand-1
Gleich mal ausprobieren
$regfile = "m32def.dat" $asm LDI R25, 17 ' Laden LDI R24, 14 ' Laden ADD R25, R24 'addieren 17 + 14, Ergebnis in R25 LDI R25, 17 'Nachladen, da R25 durch "ADD" ja verändert wurde !SUB R25, R24 'subtrahieren 17 - 14 LDI R25, 17 ' Laden LDI R24, 14 ' Laden !AND R25, R24 ' Es kommt überall dort "1" raus, wo sowohl r25 als auch R24 eine 1 haben LDI R25, 17 ' Laden LDI R24, 14 ' Laden !OR R25, R24 ' Es kommt überall dort "1" raus, wo r25 oder R24 eine 1 haben ' (ODER BEIDE !) LDI R25, 17 ' Laden LDI R24, 14 ' Laden EOR R25, R24 ' Es kommt überall dort "1" raus, wo ENTWEDER r25 oder R24 eine 1 haben ' (ABER NICHT BEIDE !) $end Asm End
Zum Probieren ist das am besten mit dem Simulator. (Register-Fenster öffnen und Einzelschritte)
Ergebnis prüfen
Normalerweise ist es ja nicht so, daß vor solchen Operationen die Rechnwerte direkt geladen werden, sondern die kommen ja von irgendwo aussen her. Und da muß man ja dann anders reagieren, je nachdem, ob die Werte gleich waren, ob r25 größer oder kleiner als r24 war, und so weiter.
Da helfen die "Flags" im Status-Register (SREG). Das ist zwar auch ein normales Byte, nur haben die einzelnen Bits darin eine spezielle Bedeutung und geben eben nähere Auskunft über die gerade abgelaufenen Operation. Nur das Wichtigste:
- ZERO-Bit Es wird automatisch gesetzt, wenn das Ergebnis genau NULL ergeben hat.
- CARRY-Bit Es wird automatisch gesetzt, wenn es einen "Überlauf" gegeben hat
Man kann diese (und noch andere) Flags sehen, wenn man im Simulator auf "µP" drückt.
Z = ZERO C = CARRY
Beispiele:
LDI R25, 17 LDI R24, 14 !SUB R25, R24
Zero & Carry sind nicht gesetzt, denn das Ergebnis ist ungleich NULL, und "17" ist außerdem größer als "14"
LDI R25, 17 LDI R24, 17 !SUB R25, R24
Jetzt ist Zero gesetzt, denn das Ergebnis ist gleich NULL
LDI R25, 12 LDI R24, 44 !SUB R25, R24
Jetzt ist das Carry-Bit gesetzt, denn "12" ist ja kleiner als "44", das Ergebnis ist also negativ