www.mikrocontroller.net

Forum: Compiler & IDEs GCC Assembler und Thumb Code


Autor: Mr. T (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich wurde von einem Bekannten auf dieses Forum aufmerksam gemacht, und 
hoffe dass Ihr mir helfen könnt.

Ich versuche gerade Assemlbercode mit dem Thumb/2 Instruction set zu 
schreiben,  mein wissen beschränkt sich eigentlich auch 8086 assembler. 
Der Code soll auf einem Cortex laufen - mit dem Prozessor kenne ich mich 
etwas aus, allerdings habe ich bisher nur C / C++ Code dafür 
geschrieben.

Naja ich wollte mal ein paar "Trockenübungen" machen und stehe schon vor 
einem Problem:
    MOVS        R1, #0xAAAAAAAA
    MOVS   R0, #0x0
    CMP   R1, #0xBBBBBBBB
    ADDNE       R0,R0,#0x1

Ich bekomme den Fehler beim übersetzten:
Error: thumb conditional instruction should be in IT block -- `addne 
R1,R1,#0x1'.

Verstehe ich nicht... ich mach einen compare und dann ein conditional 
add... was ist daran falsch? :(

Hier gibts sicher Cracks die mehr Ahnung haben als ich... vielleicht 
kennt auch einer eine gute Thumb Code Sammlung? Oder Tutorial? Die 
Instruction-Set Referencen und das CPU Reference Manual hab ich 
ausgedruckt vor mir liegen.

Danke und beste Grüße,
Mr. T

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mr. T schrieb:

> Error: thumb conditional instruction should be in IT block -- `addne
> R1,R1,#0x1'.

Der Thumb-Befehlssatz benötigt für bedingte Ausführung einen 
Präfix-Befehl. Prinzip:
    MOVS   R1, #0xAAAAAAAA
    MOVS   R0, #0x0
    CMP    R1, #0xBBBBBBBB
    IT     NE
    ADDNE  R0,R0,#0x1

Wenn man es so schreibt, funktioniert das (im Prinzip) auf ARM und Thumb 
- der IT Befehl ist für Thumb da, der NE Postfix am ADD für ARM.

> Verstehe ich nicht... ich mach einen compare und dann ein conditional
> add... was ist daran falsch? :(

Dass es einen conditional ADD nur beim nativen ARM Befehlssatz gibt, 
nicht bei Thumb.

> Instruction-Set Referencen und das CPU Reference Manual hab ich
> ausgedruckt vor mir liegen.

Dann schau in der Referenz mal unter dem "IT" Befehl nach. Aber bitte in 
der vollen Referenz, nicht in der 4-Seiten Tabelle.

Autor: Mr. T (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ersteinmal danke! Ist ja ne interessante Sache mit diesem IT Befehl, 
realisiert also IF-THEN, wenn auch etwas ungewohnt wenn man nur den 8086 
kennt.

A. K. schrieb:
> Dann schau in der Referenz mal unter dem "IT" Befehl nach. Aber bitte in
> der vollen Referenz, nicht in der 4-Seiten Tabelle.

Mhh wo find ich die volle Referenz? Ich habe hier in der Tat nur die 
"Quick Reference Card" (6 Seiten). Google spuckt mir nur Links zu eben 
dieser Quick Reference aus. Kann es sein, dass ich das nur auf der ARM 
Webseite finde wenn ich mich anmelde?

Danke und Gruß,
Mr. T

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mr. T schrieb:

> Mhh wo find ich die volle Referenz?

Beim Bäcker natürlich, wo denn sonst?

http://infocenter.arm.com/help/index.jsp?topic=/co...

> dieser Quick Reference aus. Kann es sein, dass ich das nur auf der ARM
> Webseite finde wenn ich mich anmelde?

Finden geht auch ohne. Runterladen nur mit.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich finde diese Erklärung übrigens selbst in der vollen Referenz nicht.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin mir sehr sicher, dass der IT Befehl dort aufgeführt ist. Der 
Zusammenhang mit dem (Thumb) IT Befehl und den (ARM) Suffixen könnte 
möglicherweise irgendwo in einem Dokument zur "neuen" Assembler-Struktur 
stehen. ARM hatte ja irgendwann mal die Mnemotechnik der Thumb-Befehle 
umgedreht um architekturübergreifend programmieren zu können.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich habe hier vorliegen das

ARM Architecture
Reference Manual

ARM DDI 0100I

Copyright © 1996-1998, 2000, 2004, 2005 ARM Limited. All rights 
reserved.

Da finde ich nichts über einen IT-Befehl.  Gibt's noch was neueres,
habe ich mir da ein altes andrehen lassen?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yep, das dürfte noch die alte Version ohne Thumb2 sein. Der IT Befehl 
ist wie die Cortex-M3 auf Stand Thumb2, d.h. diese Referenz ist dafür 
nicht wirklich geeignet.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nö, Thumb v3 ist erwähnt:

Architecture version

For the convenience of the reader, this section describes the version
of the ARM architecture that the instruction is associated with, not
the version of the Thumb instruction set. There have been three
versions of the Thumb instruction set architecture to date:

THUMBv1 This is used in T variants of version 4 of the ARM instruction
        set architecture.

THUMBv2 This is used in T variants of version 5 of the ARM instruction
        set architecture.

THUMBv3 This is used in version 6 and above of the ARM instruction set
        architecture.

Instructions which are described as being in all T variants are
therefore present in THUMBv1, THUMBv2, and THUMBv3. and those that are
described as being in T variants of version 6 and above are in THUMBv3
only.

Autor: Mr. T (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich hab mir das Reference man jetzt mal geladen:

ARM®v7-M Architecture
Reference Manual
Copyright © 2006-2010 ARM Limited. All rights reserved.
ARM DDI 0403C_errata_v3 (ID021910)

Der IT Befehl ist hier aufgeführt: "A6.7.37 IT". Allerdings wird aus dem 
Abschnitt nicht klar dass er für solche conditions verwendet werden 
muss. Aber das steht mit Sicherheit an anderer Stelle. Ich werde mich 
da mal demnächst einlesen. 8086 und Cortex/Thumb 2 sind wohl komplett 
unterschiedliche Welten was die Assembler Syntax und den Befehlssatz 
angeht.

Autor: Mr. T (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:
> THUMBv2 This is used in T variants of version 5 of the ARM instruction
>         set architecture.

Und kann es sein das THUMBv2 und THUMB2 unterschiedlich sind? Ich denke 
mal THUMBv1-3 sind revisions von Thumb(1). Weil von Thumb3 hab ich noch 
nie was gehört.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, das fehlende "v" in "Thumb2" habe ich übersehen.  Ist aber etwas
verwirrend dann...  Leider ist die Webseite da gerade gar nicht der
Meinung, mir irgendwie das von dir genannte PDF zu verabreichen.  Die
bringt mich nach einigen Sekunden immer wieder auf sich selbst zurück.

Aber das heißt ja dann, dass das mit dem IT ohnehin erst ab dem
Cortex M3 geht, oder?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:

> Aber das heißt ja dann, dass das mit dem IT ohnehin erst ab dem
> Cortex M3 geht, oder?

Korrekt.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:
> Leider ist die Webseite da gerade gar nicht der
> Meinung, mir irgendwie das von dir genannte PDF zu verabreichen.

OK, mit einmal ausloggen und neu einloggen geht's nun.  Ich hoffe mal,
der Webserver ist nicht "powered by ARM". ;-)

Ich habe übrigens die Stelle, die du vermisst hast, auch gefunden:

In Thumb instructions, the condition (if it is not AL) is normally
encoded in a preceding IT instruction, see Conditional instructions on
page A4-4, ITSTATE on page A6-10 and IT on page A6-78 for
details. Some conditional branch instructions do not require a
preceding IT instruction, and include a condition code in their
encoding.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:

> Ich habe übrigens die Stelle, die du vermisst hast, auch gefunden:

Naja, direkt vermisst hatte ich sie nicht, ich habe die Referenz hier 
nur nicht parat, konnte also nicht live nachsehen.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, meine Bemerkung bezog sich auf diesen Beitrag:
Beitrag "Re: GCC Assembler und Thumb Code"

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:

> OK, das fehlende "v" in "Thumb2" habe ich übersehen.  Ist aber etwas
> verwirrend dann...

Alte ARM-Tradition. Der subtile Unterschied zwischen ARM7 (=ARMv4) und 
ARMv7 (Cortex) hat auch schon manche verwirrt.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:

> Alte ARM-Tradition.

:-)

Sieht mir auch so aus, als würde die ARMv7-Referenz nicht mehr auf
die Unterschiede zu den älteren Cores eingehen.  Damit muss man sich
wirklich beide Dokumente hinlegen, wenn man mit verschiedenen ARMs
arbeitet.  Schade, die ARMv5-Referenz hat noch jeweils markiert, ab
welcher Core-Version der entsprechende Befehl verfügbar ist.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:

> Sieht mir auch so aus, als würde die ARMv7-Referenz nicht mehr auf
> die Unterschiede zu den älteren Cores eingehen.

Aber dafür eignet sich die Quickref.

Autor: 900ss D. (900ss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OT
Hey Jörg, wandelst du etwa auf fremden Pfaden?
Bist den AVRs untreu geworden. ;-)
/OT

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
900ss D. schrieb:
> Hey Jörg, wandelst du etwa auf fremden Pfaden?

Man muss doch mal übern Tellerrand hinausgucken. ;-)  ARM hatte mich
schon immer mal interessiert, und mich beschleicht das Gefühl, dass
er über kurz oder lang auch dienstlich relevant werden könnte.

Was mich bissel nervt ist, dass es keine so schön zusammengestellte
und "am Stück" compilierbare Bibliothek + Co wie die avr-libc gibt,
die vom crt0.S bis zu den Linkerscripts alles enthält.

Autor: 900ss D. (900ss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:
> 900ss D. schrieb:
>> Hey Jörg, wandelst du etwa auf fremden Pfaden?
>
> Man muss doch mal übern Tellerrand hinausgucken. ;-)  ARM hatte mich
> schon immer mal interessiert, und mich beschleicht das Gefühl, dass
> er über kurz oder lang auch dienstlich relevant werden könnte.
>

Auch nicht schlecht. Ich darf mit SPARCs arbeiten.
Ist auch nicht so übel aber aktuelle Technik ist was anderes.

> Was mich bissel nervt ist, dass es keine so schön zusammengestellte
> und "am Stück" compilierbare Bibliothek + Co wie die avr-libc gibt,
> die vom crt0.S bis zu den Linkerscripts alles enthält.

Ja das ist wahr. Das ist bei den AVRs wirklich recht gut. Da wartet eine 
neue Aufgabe ;-)
Aber so schwer ist der Startup auch nicht. Schau dir den mal bei den 
SPARCs an :-)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
900ss D. schrieb:
> Ich darf mit SPARCs arbeiten.

Hatte ich mir im Rahmen von FreeBSD/sparc64 mal angesehen.  Fand ich
immer eine schöne Prozessorarchitektur, vor allem die Tatsache, dass
es der aktuellen Implementierung offen ist, wie viele CPU-Register
sie in Hardware implementiert, finde ich eine nette Idee.

Irgendwie so richtig schnell haben sie den Prozessor halt wohl nur
nie bekommen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:

> es der aktuellen Implementierung offen ist, wie viele CPU-Register
> sie in Hardware implementiert, finde ich eine nette Idee.

Da war so eine jener Ideen, die in einer kurzen Phase der 
Mikroarchitekturen Sinn ergab, oder scheinbar Sinn ergab, die sich aber 
später als überflüssig herausstellte. Ähnlich wie die Delay-Slots der 
MIPS-Architektur, die mit superskalarer Implementierung sinnlos wurden.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> die sich aber
> später als überflüssig herausstellte.

Warum eigentlich?

Autor: noch ein Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die EFM32-Dokumentationen finde ich ganz nett.
Zum Beispiel die Instructions-Set-Beschreibung hier:

http://downloads.energymicro.com/devices/pdf/d0002...

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:

> Warum eigentlich?

Worin liegt der effektive Vorteil, aus 128 Registern 512 zu machen, bei 
denen man so oder so nur auf 32 zugreifen kann? In bestimmten 
Situationen ist das günstig, weil Register statt Speicher, in anderen 
Situationen wie einem Kontextswitch bremst es.

Andererseits sind Register-Files heutiger Prozessoren Monster mit 
grössenordnungsmässig 20 parallelen Zugriffsports. Da ist man als 
Hardware-Designer froh, wenn es nicht allzu viele Register sind. 512 
64-Bit Register sind 4KB. Ein solches Registerfile konkurriert beim 
Flächenverbrauch dank der vielen Ports mit einen vielfach grösseren 
L1-Cache und wird dadurch auch nicht unbedingt schneller. Dann nochmal 
das Ganze für einen zweiten SMT-Kontext...

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:
> Sieht mir auch so aus, als würde die ARMv7-Referenz nicht mehr auf
> die Unterschiede zu den älteren Cores eingehen.  Damit muss man sich
> wirklich beide Dokumente hinlegen, wenn man mit verschiedenen ARMs
> arbeitet.  Schade, die ARMv5-Referenz hat noch jeweils markiert, ab
> welcher Core-Version der entsprechende Befehl verfügbar ist.

Das liegt daran, dass v7-M die erste ARM Architektur dieser Art ist
und die Darstellung der Unterschiede die Sache nicht übersichtlicher
macht.

Die traditionellen ARM cores sind allesamt Vorläufer der v7-A
Architektur. Unterschiede findet man daher im DDI0406 ARM ARM.

Gruß
Marcus

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Worin liegt der effektive Vorteil, aus 128 Registern 512 zu machen, bei
> denen man so oder so nur auf 32 zugreifen kann?

Gut, so tief geschachtele Prozeduraufrufe wird man am Ende nicht haben,
stimmt.  Die 128 werden für einen großen Teil genügen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:

> Gut, so tief geschachtele Prozeduraufrufe wird man am Ende nicht haben,
> stimmt.

Hat man schon, aber laufzeitmässig dürften nur die untersten paar 
Aufrufebenen spürbar von Bedeutung sein, der Rest geht unter.

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.