Przeskakiwanie do etykiet w asemblerze wbudowanym

Specyficzne dla firmy Microsoft

Podobnie jak zwykła etykieta języka C lub C++, etykieta w __asm bloku ma zakres w całej funkcji, w której jest definiowana (nie tylko w bloku). Instrukcje zestawów i goto instrukcje mogą przechodzić do etykiet wewnątrz lub na zewnątrz __asm bloku.

Etykiety zdefiniowane w __asm blokach nie są uwzględniane wielkości liter. Instrukcje i goto instrukcje zestawu mogą odwoływać się do tych etykiet bez względu na wielkość liter. Etykiety C i C++ są uwzględniane wielkości liter tylko wtedy, gdy są używane przez goto instrukcje. Instrukcje dotyczące zestawu mogą przejść do etykiety C lub C++ bez względu na wielkość liter.

Poniższy kod przedstawia wszystkie permutacje:

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

Nie używaj nazw funkcji biblioteki języka C jako etykiet w __asm blokach. Na przykład może być kuszony, aby użyć exit jako etykiety w następujący sposób:

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

Ponieważ exit jest nazwą funkcji biblioteki języka C, ten kod może spowodować przejście do funkcji exit zamiast do żądanej lokalizacji.

Podobnie jak w programach MASM, symbol dolara ($) służy jako licznik bieżącej lokalizacji. Jest to etykieta dla aktualnie składanej instrukcji. W __asm blokach jego głównym zastosowaniem jest wykonanie długich skoków warunkowych:

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

END Microsoft Specific

Zobacz też

Wbudowany asembler