Comment concaténer arguments macro GNU GAS avec d'autres jetons pour faire seule étiquette?

StackOverflow https://stackoverflow.com/questions/2990413

  •  24-10-2019
  •  | 
  •  

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.

  1. Pouvez-vous concaténer arguments aux macros avec d'autres jetons pour faire des jetons simples?
  2. Quelle est votre référence assembleur de gaz préféré?
Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top