gcc produziert ungewollt THUMB

OP #1337767
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.