Hallo Leute,
ich beiss mir grad an einem Assemblerbefehl im THUMB2 Set die Zähne aus.
Und zwar handelt es sich um den TBB bzw TBH Befehl. Mit ihm soll es
möglich sein eine switch/case Anweisung in Assembler zu realisiern.
Allerdings kann ich da so garnix mit anfangen. Ein Beispiel lässt sich
auch nicht finden.
Sehr geholfen wäre mir, wenn jemand die genau Funktion des Befehls mal
erklären würde. Oder zumindesteine Vorgehensweise.
Unter folgendem Link findet man eine kurze Beschreibung, vllt hilft sie
ja euch weiter.
http://www.keil.com/support/man/docs/armasm/armasm_cjafifbd.htm
Vielen Dank schon mal im Vorraus.
MfG
Die Beschreibung hinter deinem Link Beschreibt den Befehl doch scheinbar
ganz gut:
- Du brauchst eine Liste mit offsets ("Sprungdistanzen") im Speicher
(Bytes/Halfwords, daher TBB/TBH)
- in Rn kommt die Adresse der Tabelle (mittels Label)
- in Rm der index, d.h. welcher Sprung genommen werden soll
- für dein switch-case musst du den index eben passend setzen/berechnen
- der ARM springt anschließend entsprechend weiter
Nur: Wie man diese Tabelle in Assembler geschickt erstellt, muss noch
ausgeknobelt werden ;)
hth, Jörg
ps.: http://de.wikipedia.org/wiki/Sprungtabelle hilft dir evtl. auch
weiter
Ja genau daran scheuert es momentan auch bei mir. Wie ich diese Tabelle
geschickt aufbau.
Aber deine kurze Zusammenfassung hat schon mal Licht ins dunkle
bebracht, Danke.
Nach näherem hinsehen (Ich würde ARMe ganz sicher nicht in Assembler
programmieren) könntest du sowas probieren (ungetestet! - Ich hab keine
Ahnung von ARMs, hab mir nur die verlinkte doku angeschaut):
1
jmptable DCB jmpstart - target0 ; Assembler soll das ausrechnen
2
DCB jmpstart - target1
3
; ...
4
5
jmpstart TBB ...
6
; ...
7
target0 ...
8
9
target1 ...
Aber die Doku scheint ja ziemlich ausführlich zu sein.
hth, Jörg - der C bevorzugt ;)
so weit ich weiss, ist Thumb2 "compileroptimiert" und nicht unbedingt
dafür gedacht, das per Hand zu coden.
Hast du das ganze mal in C probiert und die das Resultat des armcc
angesehen, ob es sich überhaupt lohnt, das ganze in ASM zu coden?
VG,
/th.
Das Problem ist,dass ich an Assembler gebunden bin, da ich nen CUP Test
schreiben will und dass eben nur auf dieser Ebene effektiv ist. Auf die
Idee mit dem C-code kam ich auch schon. Hab ne switch/case Anweisung
geschrieben und dann mit Hilfe des Disassembly und dem Debugger
analysiert. Allerdings realisiert der Compiler die switch/case recht
primitiv und der TBB-Befehl kommt nicht zum Einsatz.
In allen anderen Fällen würd ich selber zu C tendieren, da es einfach
komfortabler ist.
> Allerdings realisiert der Compiler die switch/case recht> primitiv und der TBB-Befehl kommt nicht zum Einsatz.
Da gibt es drei Möglichkeiten, warum der Compiler das so macht:
1) Der Compiler kennt kein TBx (ist theoret. Möglich, der
Thumb2-Befehlssatz ist ziemlich neu)
2) Der Compiler ist angewiesen keine Sprungtabellen zu nutzen (z.B.
beim GCC kann man das explizit an/ausschalten, die Optimierung ist ganz
abgeschaltet, o.ä.).
3) Der Comipler ist schlauer als du ( denkst... ) und hat erkannt, dass
es anders schneller ist (Der Compiler "weiß" wie teuer die Tabelle inkl.
Vorbereitung etc. ist und "denkt" z.B. auch an das pipelining und
ähnliche µC-Spezialitäten) - das passiert ganz besonders bei
"einfachen" Tests.
hth. Jörg
ps.: Schreib deinen Code in C und arbeite ggf. mit den erzeugten
Assemblerdateien weiter.
Genau das ist es ja. Wenn ich das zeug in C schreibe und dann den
Assemblercode generieren lasse, wird die Switch/Case Anweisung anders
realisiert. Ich bentutze den Cortex M3 von STM und der kann den THUMB2.
Mein Problem ist der CPU Test. Es müssen alle Befehle des Befehlssatztes
einmal auf ihren Funktionalität getestet werden. Und da komm ich um den
TBx Befehl nicht rum. Auf die Switch/Case bin ich gekommen, da ich
gelesen hab, das eben dieser Befehl genutzt wird um Switch/Case
effektiver zu realiesieren.
Hoffe mal das Problem wird jetzt etwas klarer, Sorry anfangs undeutlich
ausgedrückt.
Aber die Idee mit der Tabelle und so von eben werd ich auf jeden Fall
mal testen, klingt auf jeden Fall plausibel. Wie genau die Sprungtabelle
jetzt aufzubauen ist versuche ich noch rauszubekommen. Wenn ich ein Paar
Erfolge verbucht hab, werd ich den Code auch mal Posten. Bis jetzt hab
ich aber nur ein paar nichtssagenden Konstrukte.
VG
Aspire wrote:
> Das Problem ist,dass ich an Assembler gebunden bin, da ich nen CUP> Test schreiben will und dass eben nur auf dieser Ebene effektiv ist.
Was ist denn ein CUP Test?
> Auf die Idee mit dem C-code kam ich auch schon. Hab ne switch/case> Anweisung geschrieben und dann mit Hilfe des Disassembly und dem> Debugger analysiert. Allerdings realisiert der Compiler die> switch/case recht primitiv und der TBB-Befehl kommt nicht zum> Einsatz.
Höhere Optimierungsstufe verwenden. Oder nimmst Du einen GCC? Der
schwächelt manchmal, was Cortex-M3 angeht. Ich empfehle am ehesten den
von CodeSourcery.
@Jörg
>Ich würde ARMe ganz sicher nicht in Assembler programmieren
"ARMe" schon, nur nicht "Thumbe". Und vor allem keine komplizierten
Kontrollstrukturen.
Das Beispiel von Jörg war fast korrekt, aber Du musst die errechneten
Werte der Tabelle noch durch zwei teilen.
Hier ist ein Beispielprogramm (Vorsicht: Endlosschleife am
Programmende):