Sdílet prostřednictvím


Definice bloků __asm jako maker jazyka C

Specifické pro Microsoft

C makra nabízejí pohodlný způsob, jak vložit do zdrojového kódu sestavení kódu, ale vyžadují zvláštní pozornost vzhledem k tomu, že makro rozbalí do jedné logické řádky.Makra lze bez potíží, postupujte podle těchto pravidel:

  • Uzavřete __asm blok do složených závorek.

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

  • Použít starý styl komentáře C ( /* comment */) místo sestavení Styl komentáře ( ; comment) nebo jeden řádek komentáře C ( // comment).

Následující příklad pro ilustraci, definuje jednoduchý makra:

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

Na první pohled, poslední tři __asm klíčová slova jsou nadbytečná.Jsou potřeba, ale protože se rozbalí makro 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í.Oddělovače pouze výkazu uznaných v __asm bloky jsou znak a __asm klíčové slovo.Blok, který je definován jako makro je logické jeden řádek, a proto je nutné oddělit každou instrukci s __asm.

Závorky jsou také nezbytné.Pokud je vynecháte, kompilátor lze zaměňovat C nebo C++ příkazy na stejném řádku vpravo od vyvolání makro.Bez uzavírací závorkou, kompilátor nemůže určit kdy přestane kódu sestavení a vidí C nebo C++ příkazy __asm blok jako návody k montáži.

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

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

Dejte pozor, abyste uvážlivě vyvolat makra z tohoto typu.Pro instanci vyvoláním makra symbolické funkce deklarována s __fastcall úmluvy může vést k neočekávaným výsledkům. (Viz použití a zachování registrů v vložené sestavení.)

Specificka produktu Microsoft END

Viz také

Referenční dokumentace

Vložený assembler