Accéder aux étiquettes dans l'assembly inline
Spécifique à Microsoft
Comme un nom simple C ou C++, un nom dans un bloc d' __asm a une portée dans toute la fonction dans laquelle elle est définie (non uniquement dans le bloc).Les instructions assembly et les instructions d' goto peuvent accéder aux noms intérieur ou extérieur de le bloc d' __asm .
Les noms définis dans des blocs d' __asm ne tiennent pas compte de la casse ; les instructions et les instructions assembleur d' goto peuvent faire référence à ces noms sans tenir compte de la casse.Les noms C et C++ respectent la casse uniquement lorsqu'ils sont utilisés par les instructions d' goto .Les instructions assemblys peuvent accéder au c ou au nom C++ sans tenir compte de la casse.
Le code suivant montre toutes les permutations :
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()
{
}
N'utilisez pas les noms de fonctions de bibliothèque C en tant que noms dans les blocs d' __asm .Par exemple, vous pouvez être tenté d'utiliser exit comme nom, comme suit :
; BAD TECHNIQUE: using library function name as label
jne exit
.
.
.
exit:
; More __asm code follows
Étant donné que sortie est le nom de la fonction de bibliothèque c, ce code peut provoquer un saut à la fonction de sortie plutôt que vers l'emplacement souhaité.
Comme dans MASM programme, le symbole dollar ($) sert de compteur de position actuelle.Il s'agit d'un nom pour l'instruction actuellement réunie.Dans les blocs d' __asm , son utilisation principale est de rendre des longs sauts conditionnels :
jne $+5 ; next instruction is 5 bytes long
jmp farlabel
; $+5
.
.
.
farlabel:
détail de FIN Microsoft