跳转到内联程序集的标签

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 的结尾

请参见

参考

内联汇编