Die Grundlagen

Die nano virtuelle Maschine verwendet Register. Es gibt 32 Register für long int und
32 Register für double Zahlen. Die mathematischen Befehle verwenden die Register.
Deshalb muss eine Variable oder Konstante zuerst in ein Register geschoben werden.

Dazu brauchen wir den "push" Befehl:

    push_i  10, L0;
    
Schiebt die Konstante "10" in Register "L0".

Um ein Register in eine Variable zu schreiben, brauchen wir den "pull" Befehl:

    pull_i  L0, x;
    
Kopiert Register "L0" in die short int Variable "x".

Sehen wir uns das in einem Beispiel an. Wir wollen "77 * 88" ausrechnen und das
Ergebnis in der Variablen "x" speichern. Die Zeilennumern sind nur zur Referenz, sie sind
kein Teil des Programms

        calc_1.na

     1| int x;
     2|
     3| push_i  77, L0;
     4| push_i  88, L1;
     5| mul_l   L0, L1, L2;
     6| pull_i  L2, x;
     7|
     8| push_i  0, L4;
     9| exit    L4;
    
Die erste Zeile deklariert die Variable "x" als "int".

In Zeile 5 multiplizieren wir: "L2 = L0 * L1". Das "L" vor einem Register meint "long int".
Deshlab benötigen wir hier den "mul_l" Befehl.

Zeile 9 beendet das Programm und setzt den Return Wert für die Shell.
Wir setzen "0", das bedeutet kein Fehler.

Beachte: NIEMALS DEN "exit" BEFEHL VERGESSEN!
DAS IST WICHTIG!
Es ist auch darauf zu achten, dass das Programm den "exit" Befehl auch jemals erreicht!


Das Beispiel hat einen Nachteil, wir können das Ergebnis nicht sehen.
Wir müssen es am Bildschirm ausgeben. Hier kommt der "print" Befehl ins Spiel:

    print_l	L2;
    
Wie du siehst, ist er einfach zu verwenden. Nur das richtige Register wird benötigt.
Aber wir wollen noch eine "neue Zeile" nach dem Ergebnis ausgeben, um eine formatierte
Ausgabe zu bekommen:

    push_i	1, L3;
    print_n	L3;
    
Der "print_n" Befehl gibt die Anzahl von neuen Zeilen aus, die im Register steht.
Hier ist das neue Programm:

        calc_2.na

     1| int x;
     2|
     3| push_i  77, L0;
     4| push_i  88, L1;
     5| mul_l   L0, L1, L2;
     6| pull_i  L2, x;
     7|
     8| print_l L2;
     9| push_i	1, L3;
    10| print_n L3;
    11|
    12| push_i  0, L4;
    13| exit    L4;
    

Befehle

    L = long Register, D = double Register
    BV = byte Variable, IV = int Variable, LV = long int Variable
    DV = double Variable, SV = string Variable
    V = Variable, N = integer Variable
    
    {} = optional (arrays)
    

Variable Deklaration

    byte            BV{[NV]};
    int             IV{[NV]};
    lint            LV{[NV]};
    double          DV{[NV]};
    string          SV[NV];
    

Variable, Konstante zu Register

    push_b          BV, L;
    push_i          IV, L;
    push_l          LV, L;
    push_d          DV, D;
    

Register zu Variable

    pull_b          L, BV;
    pull_i          L, IV;
    pull_l          L, LV;
    pull_d          D, DV;
    

Register zu Register

    move_l          L1, L2;         L1 to L2
    move_d          D1, D2;         D1 to D2
    
Next: Konsole Eingabe