GCC Assembler und Thumb Code

Gast #1819244
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
#1819262
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.
Gast #1819273
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
#1819300
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.
Moderator Persönliche Seite #1819319
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.
Gast #1819326
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.
Moderator Persönliche Seite #1819338
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?
Moderator Persönliche Seite #1819346
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.
Moderator Persönliche Seite #1819363
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.
Moderator Persönliche Seite #1819395
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.
#1819408
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 :-)
Moderator Persönliche Seite #1819420
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.
#1819423
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.
#1819494
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...
Persönliche Seite #1819495
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren