Salto a etiquetas en un ensamblado alineado

Específicos de Microsoft

Como una etiqueta normal de C o C++, una etiqueta en un bloque __asm tiene su ámbito en toda la función en la que se define (no solo en el bloque). Las instrucciones de ensamblado y las instrucciones goto pueden saltar a las etiquetas dentro o fuera del bloque __asm.

Las etiquetas definidas en los bloques __asm no distinguen entre mayúsculas y minúsculas; las instrucciones goto e instrucciones de ensamblado pueden hacer referencia a esas etiquetas sin tener en cuenta el uso de mayúsculas y minúsculas. Las etiquetas de C y C++ distinguen entre mayúsculas y minúsculas cuando se utilizan en las instrucciones goto. Las instrucciones de ensamblado pueden saltar a una etiqueta de C o C++ sin tener en cuenta el uso de mayúsculas y minúsculas.

El código siguiente muestra todas las permutaciones:

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

No utilice nombres de función de biblioteca de C como etiquetas en los bloques __asm. Por ejemplo, podría verse tentado a utilizar exit como etiqueta, como sigue:

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

Dado que exit es el nombre de una función de la biblioteca de C, este código podría producir un salto a la función exit en lugar de a la ubicación deseada.

Como sucede en los programas MASM, el símbolo de dólar ($) sirve de contador para la ubicación actual. Es una etiqueta para la instrucción que se ensambla actualmente. En los bloques __asm, su uso principal es crear saltos condicionales largos:

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

FIN de Específicos de Microsoft

Consulte también

Ensamblador insertado