Passando alle etichette in assembly inline
Specifici di Microsoft
Ad esempio un'etichetta comune di C++ o c#, un'etichetta in __asm il blocco ha ambito della funzione in cui è definito (non solo nel blocco.entrambe le istruzioni di assembly e goto le istruzioni possono passare alle etichette interno o esterno __asm blocco.
Contrassegna definito in __asm i blocchi non viene fatta distinzione tra maiuscole e minuscole; entrambi goto le istruzioni e le istruzioni in linguaggio assembly possono fare riferimento a tali etichette indipendentemente dall'evento.Le etichette C++ e c# viene fatta distinzione tra maiuscole e minuscole solo una volta utilizzate da goto istruzioni.Le istruzioni dell'assembly possono passare a c o all'etichetta di C++ indipendentemente dall'evento.
Il codice seguente mostra 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 __asm blocchi.Ad esempio, la tentazione di utilizzare exit come etichetta, come segue:
; BAD TECHNIQUE: using library function name as label
jne exit
.
.
.
exit:
; More __asm code follows
Poiché uscita è il nome della funzione della libreria di c, il codice potrebbe causare un ramo a uscita funzione anziché nella posizione desiderata.
Come nei programmi di MASM, il simbolo del dollaro ($) funge da contatore di posizione corrente.È un'etichetta per l'istruzione attualmente è completa.in __asm i blocchi, la loro utilizzo principale consiste nella creazione di rami condizionali lunghi:
jne $+5 ; next instruction is 5 bytes long
jmp farlabel
; $+5
.
.
.
farlabel:
Microsoft FINALE specifico