如何将 GNU GAS 宏参数与其他标记连接起来形成单个标签?

发布于 2024-09-04 08:32:09 字数 433 浏览 8 评论 0原文

我想使用气体宏在汇编函数中动态创建一组标签。我想做这样的事情:

 .macro set_up_jumptab_entry prefix, from=0, to=10
     .quad \prefix_\item
     .if \to-\from
     set_up_jumptab_entry \prefix,"(\from+1)",\to
     .endif
 .endm
 set_up_jumptab_entry myfunc 0 10

这里 \prefix_\item 类似于 myfunction_7。现在,我可以找到很多递归调用的示例,但我还没有找到涉及传入宏参数的标签串联之一。 Gas 的记录很少,所以回答这个问题对我来说很困难。

  1. 您可以将宏的参数与其他标记连接起来以形成单个标记吗?
  2. 您最喜欢的气体组装机参考是什么?

I would like to dynamically create a set of labels in an assembly function using a gas macro. I would like to do something like this:

 .macro set_up_jumptab_entry prefix, from=0, to=10
     .quad \prefix_\item
     .if \to-\from
     set_up_jumptab_entry \prefix,"(\from+1)",\to
     .endif
 .endm
 set_up_jumptab_entry myfunc 0 10

Here \prefix_\item would be something like myfunction_7. Now, I can find lots of examples of recursive invocation, but I haven't found one of just label concatenation involving passed-in macro arguments. Gas is quite poorly documented, so answering this question is difficult for me.

  1. Can you concatenate arguments to macros with other tokens to make single tokens?
  2. What's your favorite gas assembler reference?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

最近可好 2024-09-11 08:32:09

像这样的东西

\argA\()\argB :

应该创建一个由 argA 和 argB 组成的标签。

编辑

测试, \() 似乎没有必要;测试代码是:

    .file   "test.c"

.macro prova argA, argB
\argA\argB :
 .endm
    .text
.globl main
    .type   main, @function
main:
    leal    4(%esp), %ecx
    andl    $-16, %esp
    pushl   -4(%ecx)
    pushl   %ebp
    movl    %esp, %ebp
    pushl   %ecx
    movl    $0, %eax
    popl    %ecx
    popl    %ebp
    leal    -4(%ecx), %esp
        prova abc, def
        jmp  abcdef
    ret
    .size   main, .-main
    .ident  "GCC: (GNU) 4.3.2"
    .section    .note.GNU-stack,"",@progbits

这只是一个最小 C 代码的 gcc -S test.c 输出(懒惰:D)。 (prova 在意大利语中的意思是测试

things like

\argA\()\argB :

should create a label composed by argA and argB.

EDIT

Testing, \() seems to be not necessary; the test code was:

    .file   "test.c"

.macro prova argA, argB
\argA\argB :
 .endm
    .text
.globl main
    .type   main, @function
main:
    leal    4(%esp), %ecx
    andl    $-16, %esp
    pushl   -4(%ecx)
    pushl   %ebp
    movl    %esp, %ebp
    pushl   %ecx
    movl    $0, %eax
    popl    %ecx
    popl    %ebp
    leal    -4(%ecx), %esp
        prova abc, def
        jmp  abcdef
    ret
    .size   main, .-main
    .ident  "GCC: (GNU) 4.3.2"
    .section    .note.GNU-stack,"",@progbits

which is just gcc -S test.c output (lazyness:D) of a minimal C code. (prova means test in italian)

审判长 2024-09-11 08:32:09

您最喜欢的气体组装机参考是什么?

文档很好地介绍了这一点https://sourceware。 org/binutils/docs/as/Macro.html

字符串“()”可用于将宏参数的结尾与后面的文本分隔开。例如:

.宏操作码基本长度
    \基\().\长度
.endm

What's your favorite gas assembler reference?

The docs cover this one quite well https://sourceware.org/binutils/docs/as/Macro.html

The string `()' can be used to separate the end of a macro argument from the following text. eg:

.macro opcode base length
    \base\().\length
.endm
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文