Präprozessor
Der Präprozessor ist ein Teil des Compilers/Assemblers, der den Sourcecode für den Übersetzungsvorgang vorverarbeitet. Es existieren zwei Präprozessoren. Einmal für den Luna- und einmal für den Assembler-Quelltext.
Im Präprozessor werden folgende Teilbereiche bearbeitet:
- Auflösung von arithmetischen und logischen Ausdrücken mit Konstanten.
- Bedingte Einbindung von Code-Bereichen.
- Einbinden von externen Quelltextdateien und -Daten
- Textersetzungen von Definitionen/Makros im Sourcecode.
- Auflösung von Inline-Funktionen.
Anweisungen im Luna-Quelltext
- #if #else #elseif #endif - Bedingtes Kompilieren.
- #select #case #default #endselect - Bedingtes Kompilieren.
- #macro - Makros
- #define - Defines/Aliase.
- #declare - Deklaration eines Methoden-Aufrufs.
- #extern - Deklaration einer externen Methode zum Import.
- #global - Deklaration einer internen Methode zum Export.
- #undef - Define entfernen.
- #ide - IDE-Steuerung im Source.
- #pragma - Compiler-Steuerung im Source.
- #pragmaSave - Compiler-Steuerung im Source.
- #pragmaRestore - Compiler-Steuerung im Source.
- #pragmaDefault - Compiler-Steuerung im Source.
- #include - Quelltextdateien einbinden.
- #includeData - Binärdaten in das Datensegment einbinden.
- #library - Externe Quelltext-Bibliothek einbinden.
- #extern - Deklaration einer externen Methode.
- #error - Fehlermeldung ausgeben (Kompiliervorgang abbrechen).
- #warning - Warnmeldung ausgeben.
- #message - Nachricht ausgeben.
Anweisungen im Assembler-Code
- .if .else .elseif .endif - Bedingtes Assemblieren.
- .select .case .default .endselect - Bedingtes Assemblieren.
- .macro .endmacro - Makros.
Command | Description | Example/Values |
---|---|---|
.filetype type | output filetype (object file format) | .filetype elf64 |
.equ name = value | create a constant | .equ var = 123.45 |
.set name = value | create/assign a constant | .set var = 123.45 |
.def name = expression | Alias | .def temp = RAX |
.import name/label | import a label | .import _myLabel |
.section segment | select memory segment | .section text/bss/data |
.org | Sets the descriptor of the current active segment to a specific value | .org 0x1000 |
.error | Display a error message. Break compile/assemble. | .error „message“ |
.warning | Display a warning message. | .warning „message“ |
.message, .print | Display a info message without line number and origin. | .message „message“ |
.db | (byte) 1 byte each value and strings, data block. | .db „hello“,0x3b |
.dw | (word) 2 bytes each value, data block. | .dw 0x3bda,0x1f01 |
.dd | (double word) 4 bytes each value, data block. | .dd 0xff01ddca |
.dq | (quad word) 8 bytes each value, data block. | .dq 0xff01ddcacd48dd50 |
.bin | (file) data block from file byte-wise. | .bin „filepath“ |
.odb | (byte) 1 byte each value and strings, object data block | .odb „hello“,0x3b |
.odw | (word) 2 bytes each value, object data block. | .odw 0x3bda,0xcf01 |
.odt | (triple) 3 bytes each value, object data block. | .odt 0xf0d1a4 |
.odl | (long) 4 bytes each value, object data block. | .odd 0xff01ddca |
.obin | (file) data block from file byte-wise. 1) | .obin „filepath“ |
.dobjend | endmark for object data block with .odb, .odw, … | .dobjend label |
Allgemeine Präprozessor-Funktionen
- Defined() - Prüfen ob eine Konstante oder ein Symbol definiert ist.
- byte1-8() - 1-8. Byte eines Wertes
- byte() - Typcasting auf 8-Bit-Integer.
- int8() - Typcasting auf 8-Bit-Integer mit Vorzeichen.
- word() - Typcasting auf 16-Bit-Integer.
- integer() - Typcasting auf 16-Bit-Integer mit Vorzeichen.
- int64() - Typcasting auf 64-Bit-Integer mit Vorzeichen.
- uint64() - Typcasting auf 64-Bit-Integer.
- long() - Typcasting auf 32-Bit-Integer.
- longint() - Typcasting auf 32-Bit-Integer mit Vorzeichen.
- single() - Typcasting auf 32-Bit-Float mit Vorzeichen.
- double() - Typcasting auf 32-Bit-Float mit Vorzeichen.
- countfields() - Teil einer separierten Zeichenkette.
- odd() - Prüfen ob Wert ungerade.
- even() - Prüfen ob Wert gerade.
- chr() - Zeichenwert nach String.
- strfill() - String auffüllen mit Zeichenkette.
- asc() - Umwandlung des ersten Zeichens einer Zeichenkette in sein numerisches Equivalent.
- hex() - Konvertierung nach Hexadezimaldarstellung.
- str() - Konvertierung nach Dezimaldarstellung.
- bin() - Konvertierung nach Binärdarstellung.
- isnumeric() - Prüfen ob Argument eine Zahl ist.
- min() - Arithmetische Funktion.
- max() - Arithmetische Funktion.
- RegName() - Name eines Registers ermitteln.
- RegNum() - Nummer eines Registers ermitteln.
- TypeINT() - Wert-Typ ermitteln.
- TypeSINT() - Wert-Typ ermitteln.
- TypeUINT() - Wert-Typ ermitteln.
- TypeFLOAT() - Wert-Typ ermitteln.
- TypeOBJECT() - Wert-Typ ermitteln.
- TypeSigned() - Ermitteln ob Wert Vorzeichenbehaftet.
- TypeBits() - Anzahl Bits ermitteln die ein Wert belegt.
- ConstType() - Zahlenwert-Typ ermitteln.
- left() - Linken Teil einer Zeichenkette lesen.
- right() - Rechten Teil einer Zeichenkette lesen.
- mid() - Teil einer Zeichenkette lesen.
- format() - Formatierte Zahlendarstellung.
- nthfield() - Teil einer separierten Zeichenkette.
- Replace() - Zeichenkette suchen und erste Vorkommende ersetzen.
- ReplaceAll() - Zeichenkette suchen und alle Vorkommenden ersetzen.
- val() - Zahlenwert aus Zeichenkette extrahieren.
Nur im Assembler-Präprozessor
- Descriptor() - Aktuellen Deskriptor (Zeiger/Position) des Assemblers lesen (byte-Adresse).
- MakeIdentifier() - Ein Symbol aus einem String erstellen.
- mks(), MakeString() - Zeichenkette erzeugen.
1)
Note: No auto-alignment/padding