Unter Inline Assembly versteht man die direkte Einbindung von Maschinenspracheprogrammen in den Quellcode.
Während das unter QBASIC nur umständlich über Opcodes möglich war, ist es in FreeBASIC dank des Befehls ASM kein Problem, Assembler-Codes direkt einzubinden:
Asm mov eax, ebx
Asm imul eax, ecx
oder
ASM
mov eax, ebx
imul eax, ecx
End Asm
Auch der Zugriff auf Variablen ist "ohne Tricks" möglich; ihre Bezeichner sind auch innerhalb eines ASM-Blocks verfügbar.
Wird ein ASM-Block innerhalb einer FUNCTION verwendet, kann das Symbol FUNCTION als Pointer auf die Adresse verwendet werden, an der das Ergebnis der Funktion gespeichert werden soll.
Function Mal(ByVal x As Integer, ByVal y As Integer) As Integer
Asm
mov eax, [x] 'hole x nach eax
imul eax, [y] 'Multipliziere mit y
mov [Function], eax 'Ergebnis als Rückgabewert
End Asm
End Function
Dim As Integer a = 45, b = 54
Print Mal(a, b)
Syntax
FreeBASIC verwendet den GCC Assembler AS, der im bin-Verzeichnis als AS.EXE enthalten ist.
Der Assembler verwendet die einfache Intel-Syntax wie die bekannteren x86 - Assembler MASM, TASM, NASM, YASM und FASM.
Wie in BASIC-Quelltexten wird das Hochkomma als Zeichen für nachfolgenden Kommentar gesetzt, nicht das ";" Zeichen wie sonst in Assemblerquelltexten üblich.
Der Assembler ist in Bezug auf Labelnamen 'case sensitive', d.h. Sie müssen die Groß- und Kleinschreibung beachten.
Registerbezeichnungen
- 4 Byte Integer Register: eax, ebx, ecx, edx, ebp, esp, edi, esi
- 2 Byte Integer Register: ax, bx, cx, dx, bp, sp, di, si (Low Word der 4 Byte e__-Register)
- 1 Byte Integer Register: al, ah, bl, bh, cl, ch, dl, dh (Low(l) oder High(h) Byte der 2 Byte _x-Register)
- Floatingpoint Register: st(0), st(1), st(2), st(3), st(4), st(5), st(6), st(7)
- MMX Register (8-Byte) : mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7
- SSE Register (16-Byte) : xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
Kritische Assembleranweisungen
Je nach Betriebssystem oder Prozessortyp sind einige Assembleranweisungen nicht anwendbar. Im günstigsten Fall werden sie ignoriert oder mit einem Systemerror angezeigt, aber auch ein Systemcrash ist möglich.
Diese kritischen Assembleranweisungen für jedes Betriebssystem oder unterschiedliche Prozessortypen kann nicht für jeden Einzelfall aufgelistet werden.
Wer in Assembler arbeiten möchte, sollte die Einschränkungen der Hardware und des Betriebssystems, für das er Assembleranweisungen schreiben möchte, kennen.