Переход к меткам во встроенном коде на языке ассемблера
Блок, относящийся только к системам Майкрософт
Как и у обычной метки C или C++, область действия метки в блоке __asm
— вся функция, в которой она определена (а не только блок). Инструкции сборки и операторы goto
могут переходить к меткам внутри и вне блока __asm
.
В метках, определенных в блоках __asm
, регистр не учитывается; операторы goto
и инструкции сборки могут содержать ссылки на эти метки без учета регистра. В метках C и C++ регистр учитывается только при использовании операторами goto
. Инструкции сборки могут переходить к метке C или C++ независимо от регистра.
В следующем коде показаны все возможные случаи.
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()
{
}
Не используйте имена функций библиотеки C в качестве меток в блоках __asm
. Например, может возникнуть желание использовать в качестве метки exit
, как показано ниже.
; BAD TECHNIQUE: using library function name as label
jne exit
.
.
.
exit:
; More __asm code follows
Так как выход — это имя функции библиотеки C, этот код может вызвать переход к функции выхода вместо нужного расположения.
Как и в программах MASM, в качестве счетчика текущего расположения служит знак доллара ($
). Это метка для собираемой в данный момент инструкции. В блоках __asm
ее основное назначение — обеспечение длинных условных переходов.
jne $+5 ; next instruction is 5 bytes long
jmp farlabel ; $+5
.
.
.
farlabel:
Завершение блока, относящегося только к системам Майкрософт