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