ASM - 连接预处理器标签

时间:2016-03-21 07:35:10

标签: gcc assembly

我是汇编代码的新手,所以任何帮助都会受到赞赏 我正在编写宏来创建函数,如下所示:

.macro CREATE_FUNC ARG1 ARG2
.align 4
.func ARG1
       cmpl    $0x1, some_var
       je      skip_exec
       call ARG2
 skip_exec:
       iret
.endfunc
.endm

现在我想创建两个函数 a b ,所以我写了以下代码:

CREATE_FUNC a, aa
CREATE_FUNC b, bb

但是,当我编写代码时,我会得到"符号' skip_exec'已定义"错误,意味着 b 的CREATE_FUNC失败,因为' skip_exec'已经为 a 功能定义了。
我想通过以下方法解决它:

  1. 将标签skip_exec连接到输入参数ARG1,类似于skip_exec ## ARG1 - 但它没有工作,我也不知道该怎么做......
  2. 我看到它可以定义" LOCAL skip_exec"宏开头的部分。但它没有解决问题,我不断在编译中得到错误。
  3. 任何人都可以帮助我了解如何做(1)以及为什么(2)对我不起作用?

    谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用local labels

.macro CREATE_FUNC ARG1 ARG2
.align 4
.func ARG1
       cmpl    $0x1, some_var
       je      1f
       call ARG2
 1:
       iret
.endfunc
.endm

答案 1 :(得分:0)

我发现我可以通过放置\ @前缀:

来使用本地标签
.macro CREATE_FUNC ARG1 ARG2
.align 4
.func ARG1
       cmpl    $0x1, some_var
       je      skip_exec\@
       call ARG2
 skip_exec\@:
       iret
.endfunc
.endm