gcc produziert ungewollt THUMB

OP #1337767
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
#1337773
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.
OP #1337785
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
#1337790
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?

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