Udostępnij za pośrednictwem


Przeskakiwanie do etykiet w zestawie wbudowanym

Specyficzne dla firmy Microsoft

Jak zwykłe C lub C++ etykietę, etykieta w __asm bloku ma zakres w całej funkcji zdefiniowane (nie tylko w bloku).Obie instrukcje montażu i goto instrukcji można przejść do etykiety wewnątrz lub na zewnątrz __asm bloku.

Etykiety określone w __asm bloków nie jest uwzględniana; obie goto instrukcji i instrukcje montażu może odnosić się do tych etykiet bez uwzględniania wielkości liter.Etykiety C i C++ jest uwzględniana wielkość liter tylko wtedy, gdy jest używana przez goto instrukcji.Instrukcje montażu można przejść na etykiecie C lub C++, bez uwzględniania wielkości liter.

Poniższy kod przedstawia wszystkie permutacji:

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 nazwy funkcji biblioteki C jako etykiety w __asm bloków.Na przykład, może być kuszące użyć exit jako etykieta, w następujący sposób:

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

Ponieważ zamknąć jest nazwą funkcji biblioteki C, ten kod może spowodować skoku do zamknąć funkcja zamiast do żądanej lokalizacji.

Tak jak w programach MASM, symbol dolara ($) służy jako bieżącą wartość licznika lokalizacji.To jest etykieta instrukcji obecnie montowane.W __asm bloków, jego główne zastosowanie ma skoków długo warunkowe:

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

KONIEC informacji specyficznych dla firmy Microsoft

Zobacz też

Informacje

Asembler wbudowany