2009-05-27 5 views
1

Und wieder ich in ein Problem lief, wo ich eine einfache Lösung finden kann nicht ...Dynamische Labels in x86-Assembler

ich einige Inline-Assembler tue und ich möchte einige Code ein paar Mal ausführen, indem die .rept mit Anweisung, die dem Assembler befiehlt, so zu tun, als ob die Zeilen, die auf .rept folgen, bis zu der unmittelbar bevor .endr, die angegebene Anzahl von Malen wiederholt werden.

Das offensichtliche Problem ist natürlich, dass das Etikett 18 bereits spezifiziert wurde. Ich frage mich, , wenn es eine Möglichkeit gibt, eine dynamische Beschriftung für jede Iteration zu generieren?

__asm__ __volatile__ (".rept 10 \n\t"); 
    __asm__ __volatile__( "test eax, eax \n\t"); 
    __asm__ __volatile__( "jne 18f\n\t"); 
    ... 
    __asm__ __volatile__( "18: nop 18f\n\t"); 
    __asm__ __volatile__( ".endr\n\t"); 

Antwort

1

Wenn Sie sollten nicht tun, einen Teil der Arbeit von Hand dagegen, dies durch den Einsatz der integrierten in . (dot) Symbol machbar sein, die auf die aktuelle Zieladresse auswertet. Siehe the documentation. Sie sollten in der Lage sein, etwas zu tun:

asm volatile("jne .+1"); 

Wo die 1 geändert werden muss je nachdem, wie weit weg wollen Sie natürlich springen. Dies ist der manuelle Teil, da Sie den Offset in Bytes benötigen. Ich habe das nicht getestet, aber ich denke, es sollte funktionieren.

This page in der Dokumentation zeigt auch, wie String-Substitution verwendet wird, um Etiketten zu generieren, können Sie diese Technik auch verwenden.

1

warum überspringen Sie nicht die .rept und .endr und einfach loop stattdessen? setze ecx auf 10 (oder 0A, wenn du 10 Schleifen willst, nicht 16) setze eine Beschriftung (zB loopbegin :) wo deine rept-Anweisung ist, und loop loopbegin) wo die .endr-Anweisung ist. So wird Ihr 18-Label nicht mehrdeutig sein.