Endianness-Konvertierung in ARM
Konvertieren von big endian auf little endian im ARM?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Konvertieren von big endian auf little endian im ARM?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sprechen Sie über ARM-endian-Modi, oder etwas zu Lesen, geschrieben von einigen anderen big-endian-Prozessor, etc?
Normalerweise die Konvertierung zu/von big/little-endian-tauschen Sie die bytes um. Also 0xABCD ist 0xCDAB betrachtet als 16 bit-Zahl 0x12345678 ist 0x78563412 betrachtet, als eine 32 bit-Zahl.
ARM-cores armv5 und älter (ARM7, ARM9, etc) haben eine endian-Modus bekannt WERDEN,-32, d.h. big-endian word-invariant. armv6 und neuere (mpcore, cortex-jährigen) haben WERDEN,-8, oder big-endian-byte-invariant.
Also, wenn Sie einen armv4-zum Beispiel im big-endian-Modus und native (wenig) endian ein Wort Lesen (ldr) der Wert 0x12345678 würde 0x12345678 für eine big-endian-Wort-Lesen an der gleichen Adresse. Wort invariante Bedeutung Wort liest, geben die gleiche Antwort. Ein byte Lesen von Adresse null im little-endian-Modus der gleichen Adresse 0x78 und big-endian-byte Lesen (ldrb) wäre 0x12.
So, Sie gehen darüber hinaus nur sagen, ist es big oder little endian, aber was Anweisung verwendet wird.
Für ein armv6 oder neuere, wenn ein ldr bei einigen Adresse die Ergebnisse in 0x12345678 dann in big-endian-Modus der ldr aus der gleichen Adresse führen würde 0x78563412. Beachten Sie, dass big-oder little-endian-Modus eine Anweisung fetch für diese Adresse auf einem armv6 oder neuer Holen würde 0x12345678. Ein ldrb little-endian-Modus armv6 gleichen Daten, die gleiche Adresse Ergebnisse in 0x78, ldrb big-endian-armv6 oder auch neuere Ergebnisse in 0x78. dies ist, weil die armv6 und neuere byte invariante Bedeutung byte-Zugriffe auf die gleiche Adresse führt zum gleichen Wert, halfword, word und Doppel-word Zugriffe sind vertauscht, auf diese Architekturen als im big-endian-Modus. Da instruction fetches sind nicht vertauscht, und weil die endian-bit ist in der psr während der Ausführung einer little-endian kompiliertes Programm, das Sie wechseln können, um big-endian, eine Reihe von Anweisungen, die dann Rückkehr zum einheitlichen Modus und es gewohnt auf die Anweisung holt sich noch die interrupts, die auftreten.
Einige web-Seiten wird die Erwähnung dieser vier instruction byte swap, in Fall, dass Sie ausführen möchten, native little-endian (sehr gute Idee), und führen Sie die swap-assembler (nicht immer eine gute Idee ist, hängt davon ab, was Sie tun).
mit r1 wird der Eingang angezeigt, und r0 die Ausgabe
Für armv6 oder neuer die oben kann ausgeführt werden mit
Sehen, wenn es ein byte-Umkehrung-Befehl, d.h. (__- REV(), __REV16(), __REVSH()). Diese sind inline-assembly-Anweisungen, die nutzt die hardware im Gegensatz zu den langsameren, aber portable umgehen Antworten. (link1, link2)
Denken, wie würden Sie konvertieren endianness in einer Hochsprache wie C, und wenn dann verstehen Sie, dass können Sie leicht übersetzen Sie in die ARM-assembly, z.B.
Also für die 16-bit-Fall haben Sie zwei Schichten (einer Links und einer rechts) und ein ODER. Sie sollten in der Lage sein, dies zu tun in 3 Anweisungen.