mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik TBB-Befehl im Thumb2 Befehlssatz


Autor: Aspire (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Vielen Dank schon mal im Vorraus.

MfG

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Aspire (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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):
jmptable DCB jmpstart - target0 ; Assembler soll das ausrechnen
         DCB jmpstart - target1
;  ...

jmpstart TBB ...
;  ...
target0 ...

target1 ...
Aber die Doku scheint ja ziemlich ausführlich zu sein.

hth, Jörg - der C bevorzugt ;)

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Aspire (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Aspire (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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):
  AREA fiftyone, CODE, READONLY
  THUMB

  ENTRY
main
  LDR  r0,  =0
  LDR  r1,  =1
  LDR  r12, =jumptable

  CBZ  r1, case0
  CMP  r1, #4
  BGT  default
  SUBS  r1, #1
  
tablehead
  TBB  [r12, r1]

begintable
case1
  ADDS  r0, #1
  B  endtable
case2
  ADDS  r0, #2
  B  endtable
  
case3
  ADDS  r0, #3
  B  endtable
  
case4
  ADDS  r0, #4
  B  endtable

case0
default
endtable

stop
  B  .

jumptable
  DCB  (case1 - begintable)/2
  DCB  (case2 - begintable)/2
  DCB  (case3 - begintable)/2
  DCB  (case4 - begintable)/2

  END

Gruß
Marcus
http://www.doulos.com/arm/

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.