2010-06-07 7 views
8

Me gustaría crear dinámicamente un conjunto de etiquetas en una función de ensamblaje utilizando una macro de gas. Me gustaría hacer algo como esto:¿Cómo concatenar los argumentos de macros GNU GAS con otros tokens para hacer una sola etiqueta?

 
.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 

Aquí \ prefix_ \ item sería algo así como myfunction_7. Ahora puedo encontrar muchos ejemplos de invocación recursiva, pero no he encontrado una concatenación de etiquetas que involucre macroargumentos pasados. El gas está bastante poco documentado, por lo que responder esta pregunta es difícil para mí.

  1. ¿Puede concatenar argumentos a macros con otros tokens para crear tokens individuales?
  2. ¿Cuál es su referencia de ensamblador de gas favorita?

Respuesta

6

cosas como

 
\argA\()\argB : 

deben crear una etiqueta compuesta por argA y argB.

EDITAR

Pruebas, \() parece que no es necesario; el código de prueba fue:

.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 

que es sólo gcc -S test.c salida (pereza: D) de un código mínimo C. (prova significa test en italiano)

+0

por supuesto que se repetirá para siempre, por lo que no ejecutan el código final! – ShinTakezou

2

¿Cuál es su favorito de referencia ensamblador de gas?

Los docs cubierta éste bastante bien https://sourceware.org/binutils/docs/as/Macro.html

la cadena `()' se puede utilizar para separar el extremo de un argumento macro desde el siguiente texto. por ejemplo:

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