2017-11-08 4 views
2

Ich möchte, dies zu tun:Wie kann ich ein Label nicht in einer Makrodefinition verketten? (In GAS-Assembler)

i=0 
.rept 3 
    add rcx,[a?(i*2+1)] 
    i=i+1 
.endr 

Es sollte Ausgang dieses:

add rcx,[a1] 
add rcx,[a3] 
add rcx,[a5] 

ich keine Lösung für dieses Problem finden. Ich möchte nicht, dass es in einer Makrodefinition enthalten ist.

+0

Bauen Sie Ihre ASM mit gcc? Wenn dies der Fall ist, können Sie auch den C-Präprozessor mit einem CPP-Makro verwenden, um zwei Argumente zusammenzufügen. Außer das funktioniert nicht, wenn es passiert, bevor 'gas' das' .rept' sieht. Hmm. –

+1

Ich glaube nicht, dass es möglich ist, ohne Makros zu arbeiten. –

+0

Ich wäre neugierig, warum Sie keine Makros verwenden können? –

Antwort

2

Ich glaube nicht, dass Sie dies ohne Makros oder eine andere Art der Vorverarbeitung lösen können. Der GNU Assembler Methode, dies zu tun könnte ungefähr so ​​aussehen:

.altmacro 

.macro addmac val 
    add rcx, [a\val] 
.endm 

.macro loopmac 
    i=0 
    .rept 3 
     addmac %(i*2+1) 
     i=i+1 
    .endr 
.endm 

Sie dann die loopmac Makro wie folgt verwenden:

loopmac 

Sie finden die .altmacro Richtlinie müssen in der Lage sein %(i*2+1) richtig zu verarbeiten:

7,4 .altmacro

Sie können schreiben '% Expr', um den Ausdruck ausdruck auszuwerten und das Ergebnis als String zu verwenden.

Anstatt .rept verwenden könnten Sie .irp verwenden und das Makro vereinfachen:

.macro loopmac 
    .irp i,1,3,5 
     add rcx, [a\i] 
    .endr 
.endm 

Das letzte Beispiel benötigt keine .altmacro Verarbeitung.

Verwandte Themen