Sdílet prostřednictvím


Definování __asm bloky jako c makra

Konkrétní společnosti Microsoft

C makra nabízí pohodlný způsob sestavení kód vložit do zdrojového kódu, ale jejich poptávky zvláštní pozornost, protože makro rozšíří do jednoho logického řádku.Vytváření bezproblémového makra, postupujte podle těchto pravidel:

  • Uzavřete __asm zablokovat ve složených závorkách.

  • Umístit __asm před každou instrukci sestavení klíčové slovo.

  • Použít starý styl c komentáře ( /* comment */) namísto sestavení Styl komentáře ( ; comment) nebo Jednořádkové komentáře C ( // comment).

Pro ilustraci, následující příklad definuje jednoduchý makra:

#define PORTIO __asm      \
/* Port output */         \
{                         \
   __asm mov al, 2        \
   __asm mov dx, 0xD007   \
   __asm out dx, al       \
}

Na první pohled posledních tří __asm klíčová slova zřejmě nadbytečné.Jsou potřeba, ale protože makro rozšíří do jednoho řádku:

__asm /* Port output */ { __asm mov al, 2  __asm mov dx, 0xD007 __asm out dx, al }

Třetí a čtvrté __asm klíčová slova jsou potřebné jako oddělovače prohlášení.Rozpoznán pouze prohlášení oddělovače v __asm bloky jsou se znakem a __asm klíčové slovo.Blok definována jako makro je jedné logické linky, a proto je třeba oddělit každou instrukci s __asm.

Závorky jsou také nezbytné.Pokud je vynecháte, může kompilátor matoucí c nebo C++ příkazy na stejném řádku vpravo vyvolání makro.Bez pravá složená závorka kompilátor nelze zjistit kdy přestane kódu sestavení a vidí c nebo C++ příkazy __asm bloku jako pokyny pro sestavení.

Sestavení Styl komentáře začínající středníkem (;) nadále konec řádku.To protože kompilátor ignoruje všechno po komentář až do konce řádku logické způsobuje problémy v makrech.Totéž platí o jeden řádek komentáře c nebo C++ ( // comment).Chcete-li zabránit chybám použít starý styl c komentáře ( /* comment */) v __asm bloky, které jsou definovány jako makra.

__asm Blok zapsán jako c makro může trvat argumenty.Na rozdíl od běžných c makru, však __asm makro nemůže vracet hodnotu.Aby tato makra nelze použít ve výrazech c nebo C++.

Dejte pozor, abyste uvážlivě vyvolat makra tohoto typu.Například vyvolání makru jazyka symbolických funkce deklarované s __fastcall úmluvy mohou způsobit neočekávané výsledky.(Viz použití a zachování registry v sestavení vložené.)

Konec konkrétní společnosti Microsoft

Viz také

Referenční dokumentace

Inline Assembler