Passando para rótulos no assembly embutido
Seção específica da Microsoft
Como um rótulo C ou C++ comum, um rótulo em um bloco __asm
tem escopo em toda a função na qual é definido (não apenas no bloco). As instruções do assembly e goto
podem passar para rótulos dentro ou fora do bloco __asm
.
Rótulos definidos nos blocos __asm
não diferenciam maiúsculas de minúsculas; instruções goto
e de assembly podem se referir a esses rótulos sem considerar maiúsculas e minúsculas. Os rótulos C e C++ diferenciam maiúsculas de minúsculas somente quando usados por instruções goto
. As instruções de assembly podem passar para um rótulo C ou C++ sem considerar maiúsculas de minúsculas.
O código a seguir mostra todas as permutações:
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()
{
}
Não use nomes de função da biblioteca C como rótulos em blocos __asm
. Por exemplo, você pode querer usar exit
como um rótulo, da seguinte maneira:
; BAD TECHNIQUE: using library function name as label
jne exit
.
.
.
exit:
; More __asm code follows
Como exit é o nome de uma função da biblioteca C, esse código pode causar um salto para a função exit em vez de para o local desejado.
Como nos programas MASM, o símbolo de dólar ($
) serve como o contador de localização atual. É um rótulo da instrução que está sendo montada no momento. Nos blocos __asm
, seu principal uso é fazer saltos condicionais longos:
jne $+5 ; next instruction is 5 bytes long
jmp farlabel ; $+5
.
.
.
farlabel:
Fim da seção específica da Microsoft