Forum: Compiler & IDEs GCC Assembler und Thumb Code


von Mr. T (Gast)


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:
1
    MOVS        R1, #0xAAAAAAAA
2
    MOVS   R0, #0x0
3
    CMP   R1, #0xBBBBBBBB
4
    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

von (prx) A. K. (prx)


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:
1
    MOVS   R1, #0xAAAAAAAA
2
    MOVS   R0, #0x0
3
    CMP    R1, #0xBBBBBBBB
4
    IT     NE
5
    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.

von Mr. T (Gast)


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

von (prx) A. K. (prx)


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=/com.arm.doc.ddi0403c/index.html

> 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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

von (prx) A. K. (prx)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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?

von (prx) A. K. (prx)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Mr. T (Gast)


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.

von Mr. T (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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?

von (prx) A. K. (prx)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von (prx) A. K. (prx)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

von (prx) A. K. (prx)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von (prx) A. K. (prx)


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.

von 900ss (900ss)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von 900ss (900ss)


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 :-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von (prx) A. K. (prx)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

Warum eigentlich?

von noch ein Gast (Gast)


Lesenswert?

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

http://downloads.energymicro.com/devices/pdf/d0002_efm32g_cortex-m3_reference_manual.pdf

von (prx) A. K. (prx)


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...

von Marcus H. (mharnisch) Benutzerseite


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von (prx) A. K. (prx)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.