__asm
Specyficzne dla firmy Microsoft
Słowo __asm
kluczowe wywołuje asemblera wbudowanego i może pojawiać się wszędzie tam, gdzie instrukcja C lub C++ jest legalna. Nie może się pojawić samodzielnie. Należy wykonać instrukcję zestawu, grupę instrukcji ujętych w nawiasy klamrowe lub, co najmniej, pustą parę nawiasów klamrowych. Termin "__asm
blok" w tym miejscu odnosi się do dowolnej instrukcji lub grupy instrukcji, niezależnie od tego, czy w nawiasach klamrowych.
Uwaga
Obsługa języka Visual C++ dla słowa kluczowego Standard C++ asm
jest ograniczona do faktu, że kompilator nie wygeneruje błędu na słowie kluczowym. asm
Blok nie będzie jednak generować żadnego znaczącego kodu. Użyj __asm
zamiast asm
.
Gramatyka
asm-block:
__asm
instrukcja ;
zestawuZdecydować
__asm {
lista }
instrukcji zestawu ;
Zdecydować
lista-instrukcji zestawu:
wybór instrukcji ;
zestawu
zestaw-instrukcja-instrukcja-lista-wyboru ;
;
Uwagi
Jeśli nie są używane bez nawiasów klamrowych, słowo kluczowe oznacza, __asm
że pozostała część wiersza jest instrukcją języka zestawu. Jeśli jest używany z nawiasami klamrowymi, oznacza to, że każda linia między nawiasami klamrowymi jest instrukcją języka zestawu. Ze zgodnością z poprzednimi wersjami _asm
jest synonimem .__asm
__asm
Ponieważ słowo kluczowe jest separatorem instrukcji instrukcji zestawu, można umieścić w tym samym wierszu.
Przed programem Visual Studio 2005 instrukcja
__asm int 3
nie spowodowało wygenerowania kodu natywnego podczas kompilowania za pomocą polecenia /clr; kompilator przetłumaczył instrukcję na instrukcję przerwania CLR.
__asm int 3
teraz powoduje generowanie kodu natywnego dla funkcji. Jeśli chcesz, aby funkcja powodowała punkt przerwania w kodzie i jeśli chcesz, aby ta funkcja została skompilowana w języku MSIL, użyj __debugbreak.
Aby uzyskać zgodność z poprzednimi wersjami, jest synonimem, _asm
__asm
chyba że określono opcję kompilatora /Za (Wyłącz rozszerzenia języka).
Przykład
Poniższy fragment kodu jest prostym __asm
blokiem ujętym w nawiasy klamrowe:
__asm {
mov al, 2
mov dx, 0xD007
out dx, al
}
Alternatywnie można umieścić __asm
przed każdą instrukcją zestawu:
__asm mov al, 2
__asm mov dx, 0xD007
__asm out dx, al
__asm
Ponieważ słowo kluczowe jest separatorem instrukcji instrukcji, można również umieścić instrukcje zestawu w tym samym wierszu:
__asm mov al, 2 __asm mov dx, 0xD007 __asm out dx, al
Wszystkie trzy przykłady generują ten sam kod, ale pierwszy styl (otaczający __asm
blok w nawiasach klamrowych) ma pewne zalety. Nawiasy klamrowe wyraźnie oddzielają kod zestawu od kodu C lub C++ i unikaj niepotrzebnego powtarzania słowa kluczowego __asm
. Nawiasy klamrowe mogą również zapobiegać niejednoznaczności. Jeśli chcesz umieścić instrukcję języka C lub C++ w tym samym wierszu co __asm
blok, należy ująć blok w nawiasy klamrowe. Bez nawiasów klamrowych kompilator nie może stwierdzić, gdzie rozpoczyna się kod zestawu, a instrukcje języka C lub C++. Na koniec, ponieważ tekst w nawiasach klamrowych ma taki sam format jak zwykły tekst MASM, można łatwo wycinać i wklejać tekst z istniejących plików źródłowych MASM.
W przeciwieństwie do nawiasów klamrowych w językach C i C++, nawiasy klamrowe otaczające __asm
blok nie mają wpływu na zakres zmiennych. Można również zagnieżdżać bloki; zagnieżdżanie __asm
nie wpływa na zakres zmiennych.
END Microsoft Specific