Я хотел бы динамично создать ряд маркировок в функции блока использование газового макроса. Я хотел бы сделать что-то вроде этого:
.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. Теперь, я могу найти много примеров рекурсивного вызова, но я не нашел, что одно из просто вовлечения конкатенации маркировки передало - в макро-аргументах. Газ вполне плохо документируется, так ответ на этот вопрос трудный для меня.
такие вещи как
\argA\()\argB :
должны создавать метку, состоящую из argA и argB.
EDIT
Тестирование, \()
кажется, не нужно; тестовый код был:
.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
вывод (лень:D) минимального C-кода. (prova
означает test
на итальянском)