Asm
 
Blok kódu, který umožňuje použití instrukcí specifické architektury.

Syntaxe

Asm
instrukce závislé na architektuře
End Asm

nebo

Asm instrukce závislé na architektuře

Popis

Asm blok slouží k vložení konkrétních instrukcí strojového kódu programu za účelem provádění operací, které nemohou být prováděny pomocí funkcí jazyka, nebo pro ruční optimalizaci výkonu citlivé části kódu.

Současný kompilátor FreeBASIC produkuje pouze kód pro stroje založené na architektuře Intel 80x86; Nicméně v budoucnu by mohl být kompilátor portován na platformu, která nepodporuje stejnou instrukční sadu. Proto by Asm bloky měly být použity pouze tehdy, je-li to nutné.

Návratové hodnoty funkce lze nastavit pomocí klíčového slova Function uvnitř [] hranatých závorek, jak je uvedeno v příkladu níže.

Asm blokové komentáře mají stejou syntaxi jako se obvykle používají ve FreeBASIC komentáře (Comments) - užij FreeBASIC-like " ' " komentáře. Ne " ; " jako se používá v Assembleru.

x86 Specifikace:

Syntaxe
Syntaxe řádkového Assembleru je zjednodušenou podobou syntaxe Intel-u. Syntaxi Intel používá většina x86 Assemblerů jako MASM, TASM, NASM, YASM and FASM. Obecně platí, že na prvním místě je instrukce, následuje zdroj. Proměnné a funkce definované programem můžou být uvedeny v Asm bloku. Assembler používaný FreeBASIC-em je GAS, užívající direktivy .intel_syntax noprefix, a Asm posílá blok neupravvovaný, s výjimkou substituce místních názvů proměnných stack frame, a odstranění komentování.

Syntaxe instrukcí je stejná jakou používá FASM (Flat Assembler), s jedním důležitým rozdílem, že GAS vyžaduje, aby nastavení formátu bylo následováno slovem "ptr".

' Předpokládáme, že "blah" je FB globální nebo lokální UINTEGER proměnnou
mov  eax, [blah]        ' OK: velikost vyplývá z technologie EAX
inc  [blah]             ' Not OK: velikost není uvedena
inc  dword [blah]       ' Not OK: velikost dána, ale stále neakceptována GAS
inc  dword Ptr [blah]   ' OK: zde je pro GAS potřebné "ptr"


Zachování registrů
Když je Asm blok otevřen, registry ebx, esi, a edi jsou přesunuty do zásobníku. Po uzavření bloku tyto se registry zapíšou zpět a ze zásobníku se vymažou. Důvodem je, že tyto registry !musí! být zachovány ve většině, možná i ve všech OS využívajících x86 CPU. Díky této ochraně můžete registry využívat, aniž by byly poškozeny a aniž by jste je vy sami museli zálohovat. Neměli byste ale měnit esp a ebp, protože jsou obvykle používány k řešení lokálních proměnných.

Jména registrů
Jména registrů pro architekturu x86 jsou v Asm bloku zapsána takto:
      • 4-byte INTEGER registry: eax, ebx, ecx, edx, ebp, esp, edi, esi
      • 2-byte INTEGER registry: ax, bx, cx, dx, bp, sp, di, si (malá písmena pro 4-byte e- registry)
      • 1-byte INTEGER registry: al, ah, bl, bh, cl, ch, dl, dh (malé a velké bajty 2-bytových -x registrů)
      • Registry plovoucí desetinné čárky: st(0), st(1), st(2), st(3), st(4), st(5), st(6), st(7)
      • MMX registry (aliasy na registry plovoucí desetinné čárky): mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7
      • SSE registry: xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7
Instrukční sada

Viz tyto externí odkazy:
Nebezpečné instrukce
Všimněte si, že FreeBASIC kompilátor produkuje x86 kód ve 32-bitovém chráněném režimu, který obvykle běží na neprivilegované uživatelské úrovni; Proto jsou sice privilegované a citlivé instrukce správně schromážděny, ale nemusí správně fungovat, nebo můžou dokonce způsobit runtime chybu "General Protection Fault" (chyba obecné ochrany), "Illegal instruction" (nepovolená instrukce), nebo SIGILL error. Níže jsou uvedeny privilegované a citlivé instrukce pro Intel Pentium 4 a Xeon:
      • cli *1
      • clts
      • hlt
      • in *1
      • ins *1
      • int *1
      • into *1
      • invd
      • invlpg
      • lgdt
      • lidt
      • lldt
      • lmsw
      • ltr
      • mov to/from CRn, DRn, TRn
      • out *1
      • outs *1
      • rdmsr
      • rdpmc *2
      • rdtsc *2
      • sti *1
      • str
      • wbinvd
      • wrmsr
      • všechny SSE2 instrukce a vyšší *2

*1: citlivé na IOPL, blokováno v DOS
*2: citlivé na povolovací bity v CR4, viz níže
Privilegované instrukce budou fungovat správně v DOS při spuštění na Ring 0 DPMI kernelu, stejně jako (non-default) Ring 0 verze CWSDPMI, WDOSX nebo D3X, nicméně většina z nich není opravdu užitečná a jsou spíše nebezpečné při spuštění z DPMI kódu. RDTSC (Read Time Stamp Counter) ukazuje, že se dají použít na většině, nebo na všech OS.

Avšak užitečnost RDTSC je omezená s příchodem multi-core a hibernací CPU. SSE2 instrukce a vyšší jsou standardně po inicializaci CPU zakázány, Windows a Linux je obvykle umožňují použít, v DOS je to záležitost DPMI host: HDPMI32 je povoluje, CWSDPMI nikoliv. Instrukce INT je v DOS použitelná podle verze DOS a je třeba počítat s tím, že pracuje mírně odlišně od reálného režimu DOS, viz také FaqDOS.

Registry segmentů (cs, ds, es, fs, gs) by neměly být měněny z Asm bloku, s výjimkou určitých případů portů DOS (všimněte si, že nefungují stejným způsobem, jako v reálném režimu DOS, viz také FaqDOS). OS nebo hostitel DPMI je odpovědný za správu paměti; význam segmentů (selektory) v chráněném režimu je velmi odlišný od paměti pro reálný režim adresování.

Všimněte si, že tyto "nebezpečné" instrukce nemusí způsobit "viditelný" pád . I když běží s nedostatečným oprávněním, může se OS, nebo hostitel DPMI rozhodnout, že je "napodobí" funkčně (čtením z některých CRx pracujících pod HDPMI32), nebo "fiktivně" (nic se nestane, instrukce bude předána tiše, jako NOP).

Příklad

'' Toto je příklad pro  x86 architekturu.
Function AddFive(ByVal num As Integer) As Integer
    Asm
        mov eax, [num]
        add eax, 5
        mov [Function], eax
    End Asm
End Function

Dim i As Integer = 4

Print "4 + 5 ="; AddFive(i)


4 + 5 = 9


Assembler FreeBASIC je AS / GAS, Assembler GCC, je externí program. Pozor na:
    • Chybové řádky vrácené FBC pro Asm bloky nejsou příbuzné zdrojovým souborům FB. FBC jednoduše zobrazí chyby vrácené AS na lince vztažené k souboru kompilace, nikoliv lince samotného strojového kódu. Aby FreeBASIC ASM vůbec uchoval, musí být kompilátor vyvolán s volbou -R ("neodstraňuj ASM soubory").
    • Názvy štítků jsou malá a velká písmena uvnitř Asm bloků.

Rozdíly dialektů

  • Není k dispozici v -lang qb dialektu, pokud je odkazován s aliasem __Asm.

Rozdíly oproti QB

  • Nově ve FreeBASIC

Viz též
Překlad: Gmisiycs 8.2.2016