Partager via


Accès aux étiquettes dans l'assembly inline

Section spécifique à Microsoft

Tout comme une étiquette ordinaire C ou C++, une étiquette de bloc __asm a une portée qui s'étend à l'ensemble de la fonction dans laquelle il est défini (non seulement dans le bloc). Les instructions assembleur et les instructions goto peuvent accéder aux étiquettes à l'intérieur ou à l'extérieur du bloc __asm.

Les étiquettes définies dans les blocs __asm ne respectent pas la casse. Les instructions goto et les instructions assembleur peuvent faire référence à ces étiquettes sans tenir compte de la casse. Les étiquettes C et C++ respectent la casse uniquement lorsqu'elles sont utilisées par les instructions goto. Les instructions assembleur peuvent accéder à une étiquette C ou C++ sans tenir compte de la casse.

Le code suivant illustre 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 de noms de fonction de bibliothèque C dans les blocs __asm. Par exemple, vous pouvez être tenté d'utiliser exit comme étiquette de la façon suivante :

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

Étant donné que la sortie est le nom d’une fonction de bibliothèque C, ce code peut entraîner un saut vers la fonction de sortie au lieu de l’emplacement souhaité.

Comme dans les programmes MASM, le symbole dollar ($) sert de compteur de position actuelle. C'est une étiquette pour l'instruction en cours d'assemblage. Dans les blocs __asm, son utilisation principale consiste à créer de longs sauts conditionnels :

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

FIN de la section spécifique à Microsoft

Voir aussi

Assembleur inline