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