PBXB64 V21

X-Code

X-Code ist ein eigenständiges eingebettetes Assembler-Frontend mit einem typisierten Dialekt und einem eigenen Parser, Befehlskatalog, virtuellen Registern und Registerzuweisung. Im BASIC-Quelltext wird er mit #XCODE geöffnet und ausschließlich mit #ENDX geschlossen. Die Expansion wird anschließend vom eingebauten Inline-Assembler verarbeitet.

Eine eigenständige .asm-Datei verwendet das ASM-Frontend. #ASM … #ENDASM, #ACODE … #AEND und einzelne !-Zeilen schreiben reguläre Assemblerbefehle. X-Code ergänzt dagegen X.VREG, X.ADD, X.CLAMP, strukturierte Steuerung und Speicherbefehle. Es ist eine zusätzliche eingebettete Dialektebene; die neun durch --print-capabilities=json ausgewiesenen registrierten Spracheingänge plus der separate ASM-Eingang werden deshalb nicht als elf eigenständige Dateifrontends gezählt.

Optionen und Arbeitsweise

OPT=0..3, SPILL=AUTO|ERROR, FEATURES=BASELINE|AUTO|…, REGALLOC=AUTO|MANUAL, APX=AUTO|EMULATE|NATIVE|CHECK.

Virtuelle Register besitzen Typen wie U32, U64, I32 oder F64. Operanden müssen zum jeweiligen Befehl passen: Die Grenzen von X.CLAMP sind gleich typisierte virtuelle Register, keine unmittelbaren Zahlen. Mit --emit-xcode-asm und --xcode-allocation-report lassen sich expandierter Assembler und Registerzuweisung nachvollziehen.

1. Eigene X-Code-Befehle

commands.pb
#COMPILE EXE #DIM ALL GLOBAL result AS LONG FUNCTION PBMAIN() AS LONG #XCODE OPT=2, SPILL=AUTO, FEATURES=BASELINE X.VREG value:U32 X.VREG delta:U32 X.MOVE V(value), 5 X.MOVE V(delta), 7 X.ADD V(value), V(delta) X.VREG lower:U32 X.VREG upper:U32 X.MOVE V(lower), 0 X.MOVE V(upper), 10 X.CLAMP V(value), V(lower), V(upper) X.STORE DWORD PTR [result], V(value) #ENDX IF result <> 10 THEN PBMAIN = 1 : EXIT FUNCTION PBMAIN = 0 END FUNCTION

V21: kompiliert und nativ ausgeführt am 30.09.2026. Der Code prüft das begrenzte Ergebnis 10; Abweichungen liefern Fehlercode 1.

Geprüften Quelltext öffnen

2. BASIC-Variablen direkt verwenden

binding.pb
#COMPILE EXE #DIM ALL GLOBAL source_value AS LONG GLOBAL result AS LONG FUNCTION PBMAIN() AS LONG source_value = 21 #XCODE OPT=2, SPILL=AUTO, FEATURES=BASELINE X.VREG value:U32 X.LOAD V(value), DWORD PTR [source_value] X.ADD V(value), V(value) X.STORE DWORD PTR [result], V(value) #ENDX IF result <> 42 THEN PBMAIN = 1 : EXIT FUNCTION PBMAIN = 0 END FUNCTION

X.LOAD liest die BASIC-Variable, X.STORE schreibt das Ergebnis. V21: native Prüfung 21 × 2 = 42 bestanden. DWORD PTR bestimmt hier ausdrücklich die 32-Bit-Breite.

Geprüften Quelltext öffnen

3. Bridge aus einem anderen Frontend

bridge.pb
#COMPILE EXE #DIM ALL FUNCTION PBMAIN() AS LONG BRIDGE IMPORT counter AS LONG ALIAS "asm_imported_counter" IF counter <> 41 THEN PBMAIN = 1 : EXIT FUNCTION #XCODE OPT=2, SPILL=AUTO, FEATURES=BASELINE X.VREG value:U32 X.LOAD V(value), DWORD PTR [counter] X.INC V(value) X.STORE DWORD PTR [counter], V(value) #ENDX IF counter <> 42 THEN PBMAIN = 2 : EXIT FUNCTION PBMAIN = 0 END FUNCTION

BRIDGE IMPORT bindet das exportierte ASM-Symbol. V21: beide Quellen gemeinsam kompiliert; der native Test prüft den Anfangswert 41 und die Änderung auf 42. Das ist eine echte gemeinsame Variable, kein kopierter Wert.

Geprüften Quelltext öffnen

provider.asm

section .data global asm_imported_counter asm_imported_counter dq 41

ASM-Quelle öffnen

PBXB64 bridge.pb provider.asm -o bridge.exe bridge.exe

Die Bridge kann registrierte Variablen anderer Frontends an BASIC binden. Dieses konkrete Beispiel prüft ASM → BASIC → X-Code; andere Sprachpaare sind damit nicht automatisch nachgewiesen.

4. APX mit getrenntem Zielregister emulieren

apx-emulate.pb
#COMPILE EXE #DIM ALL GLOBAL result AS LONG FUNCTION PBMAIN() AS LONG #XCODE OPT=2, SPILL=AUTO, FEATURES=APX, APX=EMULATE mov r16, 1 mov r17, 2 add r18, r16, r17 mov DWORD PTR [result], r18d #ENDX IF result <> 3 THEN PBMAIN = 1 : EXIT FUNCTION PBMAIN = 0 END FUNCTION

V21: übersetzt und nativ auf dem vorhandenen x64-System ausgeführt; Ergebnis 1 + 2 = 3 geprüft. Die Emulation ersetzt APX-Register durch vorhandene x64-Register und benötigt für dieses Beispiel keine native APX-Hardware.

Geprüften Quelltext öffnen

In V23 behoben

Bei add r16, r17, r16 mit Anfangswerten 1 und 2 liefert die Emulation im freigegebenen V8-Compiler (PBXB64 V23) das richtige Ergebnis 3, auch wenn das Zielregister zugleich Quellregister ist. Geprüft am 05.10.2026 auf einem Prozessor ohne APX.

5. Native APX-Codierung prüfen

apx-native.pb
#COMPILE EXE #DIM ALL FUNCTION PBMAIN() AS LONG PBMAIN = 0 #XCODE OPT=2, SPILL=AUTO, FEATURES=APX, APX=NATIVE mov r16, 1 mov r17, 2 add r16, r17, r16 #ENDX END FUNCTION

V21: nur kompiliert und Codierung geprüft. Erwartete REX2/EVEX-Bytes sind vorhanden. Dieses Programm wurde nicht nativ ausgeführt; dafür muss die CPU die benötigten APX-Instruktionen tatsächlich unterstützen. Übersetzung belegt keine Hardwareausführung.

Geprüften Quelltext öffnen
PBXB64 apx-native.pb -o apx-native.exe --emit-xcode-asm native.asm DB 0xD5, 0x18, 0xC7, 0xC0, 0x01, 0x00, 0x00, 0x00 DB 0xD5, 0x18, 0xC7, 0xC1, 0x02, 0x00, 0x00, 0x00 DB 0x62, 0xEC, 0xFC, 0x10, 0x01, 0xC1

Die drei Zeilen sind tatsächlich geprüfte Ausschnitte aus native.asm. APX-EMULATE und APX-NATIVE sind unterschiedliche Prüfumfänge.

Prüfstand und Referenzen

Alle oben bezeichneten Prüfläufe verwenden die byteidentische PBXB64-0.50.0-V21-EXE aus dem PBX-V7-Paket. Eingaben, Prüfumfang, Compilerhash und Zeitpunkt sind je Beispiel dokumentiert. Einzelbeispiele ersetzen keine vollständige Compilerqualifikation. Die ausgelieferte Frontend-Dokumentation sowie die X-Code-Kapitel der CHM-Hilfe erklären Blocksyntax, Befehle, Register, Optionen und APX.

Prüfbelege ansehen#OVERRIDE / Präprozessor
Zurück zur Feature-Liste