Passaggio a etichette nell'assembly inline

Sezione specifica Microsoft

Come un'etichetta C o C++ comune, un'etichetta in un blocco __asm ha un ambito nella funzione in cui è definita (non solo nel blocco). Sia le istruzioni di assembly che le istruzioni goto possono passare alle etichette all'interno o all'esterno del blocco __asm.

Nelle etichette definite in blocchi __asm non viene fatta distinzione tra maiuscole e minuscole; sia le istruzioni goto che le istruzioni di assembly possono fare riferimento a tali etichette senza tale distinzione. Nelle etichette C++ e C viene fatta distinzione tra maiuscole e minuscole solo se utilizzate dalle istruzioni goto. Le istruzioni di assembly possono passare a un'etichetta C o C++ senza fare distinzione tra maiuscole e minuscole.

Il codice seguente illustra tutte le permutazioni:

void func( void )
{
   goto C_Dest;  /* Legal: correct case   */
   goto c_dest;  /* Error: incorrect case */

   goto A_Dest;  /* Legal: correct case   */
   goto a_dest;  /* Legal: incorrect case */

   __asm
   {
      jmp C_Dest ; Legal: correct case
      jmp c_dest ; Legal: incorrect case

      jmp A_Dest ; Legal: correct case
      jmp a_dest ; Legal: incorrect case

      a_dest:    ; __asm label
   }

   C_Dest:       /* C label */
   return;
}
int main()
{
}

Non utilizzare nomi delle funzioni della libreria C come etichette in blocchi __asm. Ad esempio, si potrebbe essere tentati di utilizzare exit come etichetta, come segue:

; BAD TECHNIQUE: using library function name as label
   jne exit
   .
   .
   .
exit:
   ; More __asm code follows

Poiché exit è il nome di una funzione di libreria C, questo codice potrebbe causare un passaggio alla funzione di uscita anziché alla posizione desiderata.

Come nei programmi MASM, il simbolo di dollaro ($) serve come contatore di posizione corrente. È un'etichetta per l'istruzione al momento assemblata. Nei blocchi __asm, l'uso principale è di eseguire passaggi condizionali lunghi:

   jne $+5 ; next instruction is 5 bytes long
   jmp farlabel ; $+5
   .
   .
   .
farlabel:

Fine sezione specifica Microsoft

Vedi anche

Assembler inline