Definiowanie bloków __asm jak makra c
Programu Microsoft
C makra oferują wygodny sposób, aby wstawić kod zestawu do kodu źródłowego, ale popytu ostrożność, ponieważ makro rozwija się w jednej linii logicznej.Aby utworzyć bezproblemowe makra, należy wykonać następujące czynności:
Należy ująć __asm zablokować w nawiasy klamrowe.
Umieścić __asm słowa kluczowego na początku każdego zestawu instrukcji.
Użyj stylu starych komentarzy C ( /* comment */) zamiast komentarze w stylu zestawu ( ; comment) lub C Komentarze jednowierszowe ( // comment).
Aby zilustrować, w poniższym przykładzie zdefiniowano prostych makr:
#define PORTIO __asm \
/* Port output */ \
{ \
__asm mov al, 2 \
__asm mov dx, 0xD007 \
__asm out dx, al \
}
Na pierwszy rzut oka, ostatnich trzech __asm słowa kluczowe wydaje się zbędne.Są one potrzebne, jednak ponieważ makro rozwija się w jednym wierszu:
__asm /* Port output */ { __asm mov al, 2 __asm mov dx, 0xD007 __asm out dx, al }
Trzecia i czwarta __asm słowa kluczowe są potrzebne jako separatory instrukcji.Separatory instrukcji tylko rozpoznane w __asm bloki są znak nowego wiersza i __asm słowa kluczowego.Ponieważ blok, zdefiniowane jako makro jest jeden wiersz logiczne, muszą być rozdzielone każda instrukcja z __asm.
Istotne są również nawiasy klamrowe.Jeżeli je pominięto, kompilator mogą zostać łatwo pomylone sprawozdaniem c lub C++, w tym samym wierszu z prawej strony wywołania makra.Bez nawias klamrowy zamykający, kompilator nie może stwierdzić, gdzie zatrzymuje zestawu kodu i jego widzi c lub C++ oświadczeń __asm blok jako instrukcje montażu.
Styl zestawu komentarze rozpoczynających się od znaku średnika (;) nadal do końca wiersza.To powoduje problemy w makrach, ponieważ kompilator ignoruje wszystko po komentarz, do końca linii logicznej.To samo dotyczy Komentarze jednowierszowe c lub C++ ( // comment).Aby uniknąć błędów, należy użyć c komentarze w starym stylu ( /* comment */) w __asm bloków określona jako makra.
__asm Blok zapisano c makra może mieć argumentów.W odróżnieniu od zwykłych c makro, jednak __asm makro nie może zwracać wartości.Aby takie makra nie można używać w wyrażeniach c lub C++.
Należy zachować ostrożność, aby nie wywołać pozbywania makra tego typu.Na przykład, wywoływanie makra języka asemblera w funkcji zadeklarowanych z __fastcall Konwencji może spowodować nieoczekiwane rezultaty.(Zobacz przy użyciu i konserwowanie rejestrów w zestawie Inline.)
KONIEC Microsoft szczególne