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; BefehleL = 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 Deklarationbyte BV{[NV]}; int IV{[NV]}; lint LV{[NV]}; double DV{[NV]}; string SV[NV]; Variable, Konstante zu Registerpush_b BV, L; push_i IV, L; push_l LV, L; push_d DV, D; Register zu Variablepull_b L, BV; pull_i L, IV; pull_l L, LV; pull_d D, DV; Register zu Registermove_l L1, L2; L1 to L2 move_d D1, D2; D1 to D2Next: Konsole Eingabe |