Comment concaténer arguments macro GNU GAS avec d'autres jetons pour faire seule étiquette?
Question
je voudrais créer dynamiquement un ensemble d'étiquettes dans une fonction d'assemblage à l'aide d'une macro de gaz. Je voudrais faire quelque chose comme ceci:
.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
Ici \ prefix_ \ item serait quelque chose comme myfunction_7. Maintenant, je peux trouver beaucoup d'exemples d'invocation récursive, mais je ne l'ai pas trouvé l'une de concaténation juste l'étiquette impliquant passé en arguments macro. Le gaz est très mal documenté, afin de répondre à cette question est difficile pour moi.
- Pouvez-vous concaténer arguments aux macros avec d'autres jetons pour faire des jetons simples?
- Quelle est votre référence assembleur de gaz préféré?
La solution
choses comme
\argA\()\argB :
devrait créer une étiquette composée par Arga argB.
EDIT
Test, \()
semble pas nécessaire; le code de test était:
.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
qui est juste sortie gcc -S test.c
(lazyness: D) d'un minimum de code C. (Moyens de prova
test
en italien)
Autres conseils
Quelle est votre référence assembleur de gaz préféré?
Les docs couvrir celui-ci bien https: // sourceware.org/binutils/docs/as/Macro.html
La chaîne `() » peut être utilisé pour séparer la fin d'un argument macro du texte suivant. par exemple:
.macro opcode base length
\base\().\length
.endm