Wie konvertiere ich Big Endian in Little Endian in ARM?Endianness-Konvertierung in ARM
Antwort
Denken Sie darüber nach, wie Sie Endianness in einer Hochsprache wie C konvertieren würden, und wenn Sie dann verstehen, dass Sie es leicht in ARM-Assembly übersetzen können, z.
uint16_t x = 0x0102;
uint16_t y = (x << 8) | (x >> 8); // y = 0x0201
Also für die 16-Bit-Fall haben Sie zwei Schichten (eine links und eine rechts) und ein OR. Sie sollten dies in 3 Anweisungen tun können.
Sprechen Sie über die Endian-Modi von ARM oder lesen Sie etwas, das von einem anderen Big-Endian-Prozessor usw. geschrieben wurde?
Normalerweise umwandeln zu/von Big/Little Endian Sie tauschen die Bytes um. Also ist 0xABCD 0xCDAB, wenn es als eine 16-Bit-Nummer 0x12345678 betrachtet wird, ist 0x78563412, wenn es als eine 32-Bit-Nummer betrachtet wird.
ARM-Cores armv5 und älter (ARM7, ARM9, usw.) haben einen Endian-Modus, der als BE-32 bekannt ist, was Big-Endian-Invariante bedeutet. Armv6 und neuere (MPcore, Cortex-Somethings) haben BE-8, oder Big-Endian-Byte-Invariante.
Also, wenn Sie einen Armv4 zum Beispiel im Big Endian Modus und nativen (kleinen) Endian Modus verwenden, wäre ein Wort read (ldr) des Wertes 0x12345678 0x12345678 für ein großes Endian Wort gelesen an der gleichen Adresse. Wortinvariantes Bedeutungswort liest 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.
Also müssen Sie darüber hinaus nur sagen, es ist groß oder wenig Endian, aber welche Anweisung wird verwendet.
Für einen armv6 oder neuer, wenn ein ldr bei einer Adresse 0x12345678 ergibt, dann würde im big endian Modus der ldr von der gleichen 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 Befehlen ausführen und dann in den nativen Modus zurückkehren und es nicht beeinflussen auftreten.
setend be ldr r0,[r1] add r0,r0,#7 str r0,[r1] setend le
Einige Webseiten werden diese vier Befehlsbyte Swap erwähnen, falls Sie nativer Little-Endian (eine sehr gute Idee) und führen Sie die Swap-Assembler (nicht immer eine gute Idee ausgeführt werden soll, hängt davon ab, was Sie sind dabei).
eor r3,r1,r1, ror #16 bic r3,r3,#0x00FF0000 mov r0,r1,ror #8 eor r0,r0,r3, lsr #8
mit r1 ist der Eingang es erscheint und r0 ist der Ausgang
Für ARMv6 oder höher können die oben mit
rev r0,r1