Aus RN-Wissen.de
Wechseln zu: Navigation, Suche
LiFePO4 Speicher Test

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.

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

Autor

PicNick

Siehe auch


LiFePO4 Speicher Test