2010-06-07 33 views
8

我想使用气体宏在装配函数中动态创建一组标签。我想这样做:如何连接GNU GAS宏参数和其他标记来制作单个标签?

 
.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一样。现在,我可以找到很多递归调用的例子,但是我还没有发现涉及传入宏参数的标签串联之一。天然气的记录很差,所以回答这个问题对我来说很困难。

  1. 你可以将参数连接到宏与其他标记以制作单个标记吗?
  2. 你最喜欢的气体装配参考?

回答

6

之类的东西

 
\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 

这仅仅是gcc -S test.c输出:的最小C代码(lazyness d)。 (prova意味着test意大利语)

+0

当然会循环永远,所以不执行最终代码! – ShinTakezou 2010-06-07 15:20:13

2

什么是你最喜欢的气体装配参考?

该文档盖这一个相当好https://sourceware.org/binutils/docs/as/Macro.html

字符串`()”可以被用来从以下文本的宏参数的末端分离。例如:

.macro opcode base length 
    \base\().\length 
.endm