Sdílet prostřednictvím


Přechod na popisky v sestavení inline assemblerem

Specifické pro Microsoft

Stejně jako běžný popisek jazyka C nebo C++ má popisek v __asm bloku obor v celé funkci, ve které je definován (nejen v bloku). Pokyny k sestavení i goto příkazy můžou přeskočit na popisky uvnitř nebo mimo __asm blok.

Popisky definované v __asm blocích nerozlišují malá a velká písmena. Příkazy goto i pokyny k sestavení můžou odkazovat na tyto popisky bez ohledu na malá a velká písmena. Popisky jazyka C a C++ rozlišují malá a velká písmena pouze v případě, že goto je používají příkazy. Pokyny k sestavení můžou přejít na popisek jazyka C nebo C++ bez ohledu na případ.

Následující kód ukazuje všechny permutace:

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

Nepoužívejte názvy funkcí knihovny jazyka C jako popisky v __asm blocích. Můžete být například lákaví použít exit jako popisek následujícím způsobem:

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

Vzhledem k tomu , že exit je název funkce knihovny jazyka C, může tento kód způsobit přechod na výstupní funkci místo do požadovaného umístění.

Stejně jako v programech MASM slouží symbol dolaru ($) jako čítač aktuálního umístění. Jedná se o popisek pro instrukci, která se právě sestavuje. V __asm blocích je hlavním využitím provádět dlouhé podmíněné přeskakování:

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

END Microsoft Specific

Viz také

Vkládaný assembler