2010-06-07 7 views
8

Chciałbym dynamicznie utworzyć zestaw etykiet w funkcji złożenia za pomocą makra gazu. Chciałbym zrobić coś takiego:Jak połączyć argumenty makra GNU GAS z innymi tokenami, aby utworzyć pojedynczą etykietę?

 
.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 

Tutaj \ prefix_ \ item byłoby coś myfunction_7. Teraz mogę znaleźć wiele przykładów rekursywnej inwokacji, ale nie znalazłem jednego z tylko konkatenacji etykiet z udziałem przekazanych argumentów makr. Gaz jest dość słabo udokumentowany, więc odpowiedź na to pytanie jest dla mnie trudna.

  1. Czy można połączyć argumenty z makrami z innymi tokenami, aby utworzyć pojedyncze tokeny?
  2. Jakie jest twoje ulubione odniesienie do asemblera?

Odpowiedz

6

rzeczy jak

 
\argA\()\argB : 

należy utworzyć etykietę złożoną przez argA i argB.

EDIT

Testowanie, \() wydaje się nie być konieczne; kod testowy był:

.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 

który właśnie gcc -S test.c wyjściowy (lazyness: D) minimalnego kodu C. (prova oznacza test w języku włoskim)

+0

oczywiście będzie to pętla na zawsze, więc nie wykonać ostateczny kod! – ShinTakezou

2

Jaki jest Twój ulubiony odniesienia monter gaz?

Docs cover ten dość dobrze https://sourceware.org/binutils/docs/as/Macro.html

Ciąg `()” może być używany do oddzielania koniec makro argumentu z poniższym tekstem. np:

.macro opcode base length 
    \base\().\length 
.endm 
Powiązane problemy