Forum: Compiler & IDEs gcc produziert ungewollt THUMB


von Daniel G. (motello)


Lesenswert?

Hallo,
ich habe dem Compiler die option -marm mitgegeben um nur arm-code zu 
produzieren. Das assembler listing zeigt auch auf den ersten blick nur 
arm instructions. Wenn ich dann aber das object file disassembliere, ist 
beispielsweise der stm-befehl durch push ersetzt.

Der Witz ist noch, dass der push-Befehl 4 byte lang ist: 0xe52db004

Was soll das? Ist es doch nur arm code? toolchain ist codesourcery 
arm-none-eabi.

Viele Grüße
Daniel Gering

von (prx) A. K. (prx)


Lesenswert?

Daniel G. schrieb:

> arm instructions. Wenn ich dann aber das object file disassembliere, ist
> beispielsweise der stm-befehl durch push ersetzt.

Hast du mal kontrolliert, ob dieser ominöse PUSH-Befehl nicht in 
Wirklichkeit der gesuchte STM-Befehl ist?

Es führen mehrere Wege nach Rom. Manche Assembler-Befehle sind einfach 
nur Spezialformen anderer Befehle. So ist der PUSH Befehl in Thumb2 in 
der Langfassung eine Spezialform von STM und im ARM-Modus mag es 
heutzutage ähnlich aussehen. Deshalb muss sich der Disassembler für eine 
Variante entscheiden. Was der Programmierer/Compiler in den 
Assembler-Quelltext reingeschrieben hat kann er nicht wissen.

von Daniel G. (motello)


Lesenswert?

OBJDUMP sollte es wissen, oder? Denn wie kann Thumb und ARM nicht 
eindeutig sein? Das eine hat 4 byte und das andere 2 byte Länge.

Also ist es ein OBJDUMP Fehler?

Kontrolliert habe ich es nicht, dazu müsste ich wohl die Zahl oder Teile 
davon per Befehlssatz-Spezifikation selbst ermitteln und vergleichen?!

Grüße
Daniel

von (prx) A. K. (prx)


Lesenswert?

Daniel G. schrieb:

> OBJDUMP sollte es wissen, oder? Denn wie kann Thumb und ARM nicht
> eindeutig sein? Das eine hat 4 byte und das andere 2 byte Länge.

ARM hat immer 4 Byte, aber Thumb2 hat teils 2 teils 4 Bytes. Das spielt 
hier aber keine Rolle.

Ausserdem ist es durchaus nicht eindeutig. Siehe 
http://www.arm.com/pdfs/QRC0001H_rvct_v2.1_arm.pdf unter PUSH. Das ist 
auch im ARM Modus ein Synonym von STMDB SP!. Der Disassembler hat sich 
offenbar entschieden, in diesem Fall diese Spezialform anzuzeigen, an 
Stelle der generischen Version.

Das ist letztlich auch die Folge einer Revision den Mnemotechnik durch 
ARM. ARM hat dabei versucht, die Syntax in ARM und Thumb-Modus so 
Modus-unabhängig zu gestalten wie möglich. An den Maschinenbefehlen hat 
sich nichts geändert, an den Namen davon jedoch schon.

In anderen Architekturen kriegt man ähnliche Probleme. So ist bei AVR 
der "ROL r" Befehl tatsächlich nur ein Synonym für "ADC r,r", aber woher 
soll der Disassembler wissen was der Programmierer geschrieben hat?

von Daniel G. (motello)


Lesenswert?

Danke für die Info! Dann kann ich also davon ausgehen, dass Thumb 
keinesfalls verwendet wird wenn ich die -marm option gesetzt habe? Wobei 
diese ja ohnehin default ist?!

von (prx) A. K. (prx)


Lesenswert?

Ja.

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.