跳转到内联程序集的标签
Microsoft 专用
与普通的 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:
特定于 Microsoft 的结尾