Endianness Konvertierung in ARM

8

Wie konvertiere ich Big Endian in Little Endian in ARM?

    
seyoung 26.11.2010, 15:48
quelle

3 Antworten

17

Sprechen Sie über die Endian-Modi von ARM oder lesen Sie etwas, das von einem anderen Big-Endian-Prozessor usw. geschrieben wurde?

Normalerweise konvertiert man zu / von big / little endian die Bytes um. Also ist 0xABCD 0xCDAB, wenn es als 16-Bit-Nummer 0x12345678 betrachtet wird, ist 0x78563412, wenn es als 32-Bit-Nummer betrachtet wird.

ARM-Kerne armv5 und älter (ARM7, ARM9 usw.) haben einen Endian-Modus, der als BE-32 bekannt ist, was Big-Endian-Wort-Invariante bedeutet. Armv6 und neuere (MPcore, Cortex-Somethings) haben BE-8, oder Big-Endian-Byte-Invariante.

Wenn Sie also einen Armv4 zum Beispiel im Big Endian Modus und im nativen (kleinen) Endian Modus verwenden, wäre ein Wort read (ldr) des Wertes 0x12345678 0x12345678 für ein großes Endian Wort, das an der gleichen Adresse gelesen wird. Das Wort, das invariant bedeutungswort liest, geben die gleiche Antwort. Ein Byte-Lesen der Adresse Null im Little-Endian-Modus der gleichen Adresse wäre 0x78 und Big-Endian-Byte-Lesen (ldrb) wäre 0x12.

Sie müssen also darüber hinausgehen und sagen, ob es ein großer oder ein kleiner Endian ist, aber welche Anweisung wird verwendet.

Wenn ein ldr bei einer Adresse zu 0x12345678 führt, dann würde im big-endian-Modus der ldr von derselben Adresse zu 0x78563412 führen. Beachten Sie, dass ein großer oder kleiner Endian-Modus ein Befehl holen für diese Adresse auf einem armv6 oder neuer 0x12345678 holen würde. Ein ldrb Little Endian Mode Armv6 gleiche Daten die gleiche Adresse ergibt 0x78, ldrb Big Endian Armv6 oder neuer ergibt auch 0x78. Dies liegt daran, dass armv6 und neuer Byte-invarianter Bedeutungs-Byte-Zugriffe auf die gleiche Adresse sind, wenn dieselben Wert-, Halbwort-, Wort- und Doppelwort-Zugriffe auf diese Architekturen im Big-Endian-Modus vertauscht werden. Da Befehlsabrufe nicht vertauscht werden und weil das Endian-Bit in der psr ist, während ein kleines endian-kompiliertes Programm läuft, können Sie zu Big-Endian wechseln, eine Anzahl von Anweisungen ausführen und dann in den nativen Modus zurückkehren und es nicht beeinflussen auftreten.

%Vor%

Einige Webseiten erwähnen diesen 4-Befehl-Byte-Swap, falls Sie natives Little Endian (eine sehr gute Idee) ausführen und den Swap mit Assembler durchführen wollen (nicht immer eine gute Idee, hängt davon ab, was Sie tun).

%Vor%

wobei r1 die Eingabe ist und r0 die Ausgabe

ist

Für Armv6 oder neuer kann das obige mit

ausgeführt werden %Vor%     
old_timer 26.11.2010 18:41
quelle
2

Siehe, ob es einen Byte-Umkehrungsbefehl gibt, d. h. (__REV (), __REV16 (), __REVSH ()). Dies sind Inline-Assembly-Anweisungen, die die Hardware im Gegensatz zu den langsameren, aber tragbaren Workaround-Antworten oben verwenden. ( nimig18 25.07.2016 02:48

quelle
1

Denken Sie darüber nach, wie Sie Endian in einer Hochsprache wie C konvertieren würden, und wenn Sie dann verstehen, dass Sie es leicht in eine ARM-Assembly übersetzen können, z. B.

%Vor%

Also für den 16-Bit-Fall haben Sie zwei Schichten (eine links und eine rechts) und ein ODER. Sie sollten dies in 3 Anweisungen tun können.

    
Paul R 26.11.2010 15:52
quelle

Tags und Links