Sdílet prostřednictvím


Definování bloků __asm jako maker v jazyce C

Specifické pro Microsoft

Makra jazyka C nabízejí pohodlný způsob, jak vložit kód sestavení do zdrojového kódu, ale vyžadují zvláštní péči, protože makro se rozšiřuje na jeden logický řádek. Pokud chcete vytvořit makra bez problémů, postupujte podle těchto pravidel:

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

  • __asm Před každou instrukci sestavení vložte klíčové slovo.

  • Místo komentářů ve stylu sestavení (/* comment */; comment) nebo jednořádkových komentářů jazyka C () použijte komentáře ve starém stylu (// comment).

Pro ilustraci následující příklad definuje jednoduché makro:

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

Na první pohled se poslední tři __asm klíčová slova jeví jako nadbytečná. Jsou však potřeba, protože makro se rozbalí na jeden řádek:

__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řeba jako oddělovače příkazů. Jedinými oddělovači příkazů rozpoznaných v __asm blocích jsou znak nového řádku a __asm klíčové slovo. Vzhledem k tomu, že blok definovaný jako makro je jeden logický řádek, je nutné oddělit jednotlivé instrukce pomocí __asm.

Složené závorky jsou také nezbytné. Pokud je vynecháte, kompilátor může být zmatený příkazy jazyka C nebo C++ na stejném řádku napravo od vyvolání makra. Bez uzavírací závorky kompilátor nemůže zjistit, kde se kód sestavení zastaví, a za blokem uvidí příkazy jazyka __asm C nebo C++.

Komentáře ve stylu sestavení, které začínají středníkem (;) pokračuje na konec řádku. To způsobuje problémy s makry, protože kompilátor ignoruje všechno po komentáři až na konec logického řádku. Totéž platí pro komentáře jazyka C nebo C++ s jedním řádkem ( // comment). Chcete-li zabránit chybám, použijte komentáře C ve starém stylu ( /* comment */) v __asm blocích definovaných jako makra.

Blok __asm napsaný jako makro jazyka C může přijímat argumenty. Na rozdíl od běžného makra jazyka C však __asm makro nemůže vrátit hodnotu. Taková makra tedy nemůžete použít ve výrazech jazyka C nebo C++.

Dávejte pozor, abyste nevyvolával makra tohoto typu nerozlišeně. Například vyvolání makra jazyka sestavení ve funkci deklarované s __fastcall konvencí může způsobit neočekávané výsledky. (Viz Použití a zachování registrů ve vložené sestavení.)

END Microsoft Specific

Viz také

Vkládaný assembler