Condividi tramite


Definendo i blocchi di __asm come macro c

Specifici di Microsoft

Le macro di C# offrono un modo pratico per inserire il codice assembly nel codice sorgente, ma richiedono la visualizzazione aggiuntiva poiché una macro si espande in una singola riga logica.Per creare macro senza difficoltà, attenersi alle regole:

  • Racchiudere __asm blocco tra parentesi graffe.

  • inserire __asm parola chiave davanti a ogni istruzione di assembly.

  • L'utilizzo C# obsoleto (commenti /* comment */) anziché le osservazioni stile assembly ( ; comment) o C# a riga singola (commenti // comment).

Per illustrare, nell'esempio seguente viene definita una macro semplice:

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

a prima vista, gli ultimi tre __asm le parole chiave vengono visualizzati superflue.Sono necessari, tuttavia, poiché la macro si espande in una singola riga:

__asm /* Port output */ { __asm mov al, 2  __asm mov dx, 0xD007 __asm out dx, al }

Il terzo e il quarto __asm le parole chiave sono necessarie come separatori dell'istruzione.Gli unici separatori dell'istruzione riconosciuti in __asm i blocchi vengono il carattere di nuova riga e __asm parola chiave.Poiché un blocco definito come una macro è una riga logica, è necessario separare ogni istruzione con __asm.

Le parentesi graffe sono indispensabili anche.Se vengono omessi, il compilatore può essere confuso con istruzioni di C++ o c# sulla stessa riga a destra di una chiamata di macro.Senza la parentesi graffa di chiusura, il compilatore non è in grado di riconoscere in cui il codice assembly verrà interrotto e vedere le istruzioni di C++ o c# dopo __asm blocchi di istruzioni in linguaggio assembly.

commenti stile assembly che iniziano con un punto e virgola (;) continuare alla fine della riga.Ciò causa problemi nelle macro perché il compilatore ignora tutte dopo che il commento, fino a risalire alla fine della riga logica.Lo stesso vale per C# a riga singola o C++ (commenti // comment).Per evitare errori, utilizzare C# obsoleto (commenti /* comment */) in __asm blocca definito come macro.

__asm bloccare scritto come una macro di C/C++ può accettare argomenti.A differenza di una macro c# comune, tuttavia, __asm la macro non può restituire un valore.Pertanto non è possibile utilizzare tali macro nelle espressioni c o C++.

Prestare attenzione a non richiamare indiscriminante le macro di questo tipo.Ad esempio, richiamando la macro in linguaggio assembly in una funzione dichiarata con __fastcall la convenzione può provocare risultati imprevisti.(Vedere Utilizzando e mantenendo i registri nell'assembly inline).

Microsoft FINALE specifico

Vedere anche

Riferimenti

Assembler inline