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