Referenz - Inline-Assembler
Unter Inline-Assembler versteht man die direkte Einbindung von Maschinenspracheprogrammen in den Quellcode.
Es ist zu beachten, dass die Verwendung von Inline-Assembler die Portierbarkeit von Programmen auf andere Plattformen oder Architekturen sehr einschränkt, denn Assembler-Code ist üblicherweise nur auf einer bestimmten Architektur (z. B. x86 oder x86_64) und einer bestimmten Plattform (z. B. Windows oder Unix) lauffähig. Von der Verwendung wird daher abgeraten, wenn dies nicht unbedingt erforderlich ist.
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.
' 32 Bit Version
Function Mal(ByVal x As Long, ByVal y As Long) As Long
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 Long 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 einen 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
Für die x86 Architektur (32-Bit):
- 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 (x87) 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
Für die x86_64 Architektur (64-Bit):
' 64 Bit Version
Function Mal(ByVal x As Integer, ByVal y As Integer) As Integer
Asm
mov rax, [x] 'hole x nach rax
imul rax, [y] 'Multipliziere mit y
mov [Function], rax 'Ergebnis als Rückgabewert
End Asm
End Function
Dim As Integer a = 2123456789, b = 2987654321
Print Mal(a, b)
- 8 Byte Integer Register: rax, rbx, rcx, rdx, rsi, rdi, rbp, rsp, r8, r9, r10, r11, r12, r13, r14, r15
- 4 Byte Integer Register: eax, ebx, ecx, edx, esi, edi, ebp, esp, r8d, r9d, r10d, r11d, r12d, r13d, r14d, r15d (Low DWord der 8 Byte r__-Register)
- 2 Byte Integer Register: ax, bx, cx, dx, si, di, bp, sp, r8w, r9w, r10w, r11w, r12w, r13w, r14w, r15w (Low Word der 8 Byte r__-Register)
- 1 Byte Integer Register: al, bl, cl, dl, sil, dil, bpl, spl, r8b, r9b, r10b, r11b, r12b, r13b, r14b (Low Byte der 8 Byte r__-Register)
- SSE Register (16-Byte): wie bei x86 und zusätzlich xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15
- Floating Point (x87) und MMX Register werden üblicherweise nicht mehr verwendet
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.
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|