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