Partilhar via


Saltando para rótulos na montagem em linha

Específico da Microsoft

Como um rótulo C ou C++ comum, um rótulo em um __asm bloco tem escopo em toda a função em que é definido (não apenas no bloco). Tanto as instruções de montagem goto quanto as declarações podem desviar-se para rótulos dentro ou fora do bloco __asm.

As etiquetas definidas nos blocos __asm não diferenciam maiúsculas de minúsculas; tanto as instruções goto como as instruções de montagem podem referir-se a essas etiquetas sem considerar o uso de maiúsculas e minúsculas. Os rótulos C e C++ diferenciam maiúsculas de minúsculas somente quando usados em instruções goto. As instruções de montagem podem saltar para um rótulo C ou C++ sem considerar maiúsculas e minúsculas.

O código a seguir mostra todas as permutações:

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ão use nomes de funções da biblioteca C como rótulos em __asm blocos. Por exemplo, você pode ficar tentado a usar exit como um rótulo, da seguinte maneira:

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

Como exit é o nome de uma função de biblioteca C, esse código pode causar um salto para a função exit em vez de para o local desejado.

Como nos programas MASM, o símbolo do dólar ($) serve como o contador de localização atual. É uma etiqueta para a instrução que está a ser montada atualmente. Nos blocos __asm, a sua principal utilização é fazer saltos condicionais longos:

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

END Específico da Microsoft

Ver também

Montador em linha