Dela via


Hoppa till etiketter i infogad assemblerkod

Microsoft-specifik

Precis som en vanlig C- eller C++-etikett har en etikett i ett __asm block omfång i hela funktionen där den definieras (inte bara i blocket). Både sammansättningsinstruktioner och goto satser kan hoppa till etiketter i eller utanför __asm blocket.

Etiketter som definieras i __asm block är inte skiftlägeskänsliga. Både goto instruktioner och sammansättningsinstruktioner kan referera till dessa etiketter utan hänsyn till skiftläge. C- och C++-etiketter är skiftlägeskänsliga endast när de används av goto -instruktioner. Monteringsinstruktioner kan hoppa till en C- eller C++-etikett utan hänsyn till skiftläge.

Följande kod visar alla permutationer:

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()
{
}

Använd inte C-biblioteksfunktionsnamn som etiketter i __asm block. Du kan till exempel vara frestad att använda exit som en etikett på följande sätt:

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

Eftersom exit är namnet på en C-biblioteksfunktion kan den här koden orsaka ett hopp till exit-funktionen i stället för till önskad plats.

Precis som i MASM-program fungerar dollarsymbolen ($) som den aktuella platsräknaren. Det är en etikett för instruktionen som just nu monteras. I __asm blocken används den framför allt för att göra långa villkorliga hopp:

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

Avsluta Microsoft Specifik

Se även

Inlinjeassembler