@Artentus: Wie ein Low-Level Basic.
Die meisten der Befehle sind 1 zu 1 als Maschinencode verfügbar (z.B. C = 3 oder O1 = C).
Durch den Compiler wird es halt vereinfacht, Sprachelemente zu verwenden und man muss sich nicht um Sprungadressen kümmern.
Und man kann sie ein kleines Framework bauen, also Code in einer Datei in mehreren Projekten importieren.
Beispiel:
Ich packe das mal in einen Expander, weil es ziemlich aufgebläht ist
Inhalt von Math.rcb
Beim Kompilieren wird zuerst der Code aus der Haupt-Codedatei und dann aus den importierten Dateien (in Reihenfolge) bearbeitet und einfach hintereinander gepackt.
Der Code sieht im "Arbeitsspeicher" (eigentlich ein EEPROM) so aus (Die Adressen sind hier immer um 1 zu hoch. Das liegt daran, dass die Zeilennummern im VB-Code-Tag mit 1 beginnen. So kann man es besser lesen):
Spoiler anzeigen
Die meisten der Befehle sind 1 zu 1 als Maschinencode verfügbar (z.B. C = 3 oder O1 = C).
Durch den Compiler wird es halt vereinfacht, Sprachelemente zu verwenden und man muss sich nicht um Sprungadressen kümmern.
Und man kann sie ein kleines Framework bauen, also Code in einer Datei in mehreren Projekten importieren.
Beispiel:
VB.NET-Quellcode
- Imports Math 'Importiert den Code aus der Datei Math.rcb, sodass er aufgerufen werden kann.
- Dim Variable As D(1) 'Die Register D(1) bis D(15) können für Variablendeklarationen verwendet werden. D(0) theoretisch auch, aber das hat eine Sonderrolle.
- Sub Main()
- C = I0 'Wert vom Eingang 0 lesen.
- A = C 'A und B sind Operanden für die ALU.
- C = I1
- B = C
- Call Math.BMinusA() 'Ruft die Methode BMinusA auf, die in einem Namespace mit dem Namen Math deklariert wurde (befindet sich in der importierten Math.
- Variable = C 'Zuweisung der Variable.
- O0 = C 'Errechneten Wert auf Ausgang 0 schreiben.
- Call Foo() 'Ruft die Methode Foo auf, die in der selben Datei deklariert wurde.
- End Sub
- Sub Foo()
- C = 8 'Konstanten Wert 8 laden.
- D(0) = C 'Das D(0)-Register wird für Vergleiche verwendet.
- C = Variable
- If C > D(0) Then
- C = B1101 'Konstanten Binärwert 1101 (13 in dezimal) laden.
- O1 = C
- End If
- End Sub
Inhalt von Math.rcb
VB.NET-Quellcode
- Namespace Math 'Deklariert alle nachfolgenden Methoden im Math-Namespace. Methoden daraus werden mit NamespaceName.MethodenName identifiziert.
- Sub BMinusA() 'Rechnet B-A und speichert das Ergebnis in C.
- C = Not A 'Wendet den den Not-Operator auf A an und speichert das Ergebnis in C.
- A = C
- C = A + B 'Addiert A und B ....
- A = C
- C = A + 1
- End Sub
Beim Kompilieren wird zuerst der Code aus der Haupt-Codedatei und dann aus den importierten Dateien (in Reihenfolge) bearbeitet und einfach hintereinander gepackt.
Der Code sieht im "Arbeitsspeicher" (eigentlich ein EEPROM) so aus (Die Adressen sind hier immer um 1 zu hoch. Das liegt daran, dass die Zeilennummern im VB-Code-Tag mit 1 beginnen. So kann man es besser lesen):
VB.NET-Quellcode
- C = I0 'Die erste Anweisung, die vorkommt. Alles vorher ist nur Syntax. (Anfang von Sub Main())
- A = C
- C = I1
- B = C
- Call 'Die Call-Anweisung benötigt eine Adresse in den nächsten 2 Bytes (little-endian).
- 0
- 23
- D(1) = C 'Variable wurde "As D(1)" deklariert. Deshalb wird das D(1)-Register im Code verwendet.
- O0 = C
- Call
- 0
- 14
- End 'Beendet die Codeausführung und springt zu Adresse 0. (Ende von Sub Main())
- C = 8 '(Anfang von Sub Foo())
- D(0) = C
- C = D(1)
- If Not C > D(0) Then Goto 'Ist die Negation der Bedingung erfüllt, wird der Code übersprungen. Benötigt eine Adresse.
- 0
- 22
- C = 13
- O1 = C
- Return 'Kehrt zur vorigen Methode zurück. (Ende von Sub Foo())
- C = Not A '(Anfang von Sub BMinusA())
- A = C
- C = A + B
- A = C
- C = A + 1
- Return '(Ende von Sub BMinusA())
- End 'Diese 2 End-Anweisungen sind im Code einzigartig. Die IDE kann den Maschinencode aus dem EEPROM lesen. Durch zwei aufeinanderfolgende End-Anweisungen wird erkannt, dass es das Ende des Codes ist.
- End 'Natürlich kann eine Sprungadresse auch genau diese Byte-Werte haben, aber es ist bekannt, welche Befehle eine Adresse benötigen. Also "Call, End, End" wird nicht als Ende angesehen, weil Call eine Adresse benötigt.
"Luckily luh... luckily it wasn't poi-"
-- Brady in Wonderland, 23. Februar 2015, 1:56
Desktop Pinner | ApplicationSettings | OnUtils
-- Brady in Wonderland, 23. Februar 2015, 1:56
Desktop Pinner | ApplicationSettings | OnUtils