Как объединить аргументы макроса GNU GAS с другими токенами, чтобы создать одну метку? - PullRequest
8 голосов
/ 07 июня 2010

Я хотел бы динамически создать набор меток в функции сборки, используя газовый макрос. Я хотел бы сделать что-то вроде этого:

 .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. Какой ваш любимый справочник по ассемблеру газа?

Ответы [ 2 ]

6 голосов
/ 07 июня 2010

такие вещи, как

\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 на итальянском языке)

2 голосов

Какой ваш любимый справочник по ассемблеру газа?

Документы достаточно хорошо охватывают этот вопрос https://sourceware.org/binutils/docs/as/Macro.html

Строка `() 'может использоваться для отделения конца аргумента макроса от следующего текста. например:

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