Saltar para rótulos de Assembly embutido
Específicos do Microsoft
Como um comum c ou C++ rótulo, um rótulo em um __asm bloco tem escopo em toda a função em que ele é definido (não apenas no bloco).Ambas as instruções do assembly e goto instruções podem saltar para rótulos dentro ou fora do __asm bloco.
Rótulos definidos no __asm blocos não diferenciam maiúsculas de minúsculas; ambos goto declarações e instruções assembly podem se referir a esses rótulos sem considerar a ocorrência.Rótulos de c e C++ diferenciam maiúsculas de minúsculas apenas quando usado por goto instruções.Instruções assembly podem saltar para um rótulo de c ou C++ sem considerar a ocorrência.
O código a seguir mostra todas as permutas a:
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 usar nomes de função de biblioteca c como rótulos em __asm blocos.Por exemplo, você poderá ficar tentado a usar exit como um rótulo, da seguinte maneira:
; BAD TECHNIQUE: using library function name as label
jne exit
.
.
.
exit:
; More __asm code follows
Porque Sair é o nome de uma função de biblioteca de C, esse código pode causar um salto para o Sair funcionar em vez de para o local desejado.
Como em programas MASM, o símbolo de dólar ($) serve como contador do local atual.Ele é um rótulo para a instrução atualmente sendo montado.Na __asm blocos, seu uso principal é tornar o longo condicionais saltos:
jne $+5 ; next instruction is 5 bytes long
jmp farlabel
; $+5
.
.
.
farlabel:
Específicos do Microsoft final