H mmm, weiß nicht, was passiert ist, es hat meine Antwort eingereicht, bevor ich wirklich angefangen habe.
Zuerst dachte ich nicht, ich könnte es mit nur zwei Registern tun, aber dann entschied ich, dass ich konnte und tat. Diese Lösungen sind nur Register, kein Speicher (außer dem ldr r0, = was Sie durch vier Befehle ersetzen können). Wenn Sie Speicher und hmmm, zwei Register verwenden, können Sie die Anzahl der Anweisungen vielleicht str, bic, bic, ldrb, orr lsl, ldrb, orr lsl reduzieren. Okay, ich habe es in einer Anweisung weniger gemacht, aber dann brauchen Sie den Speicherort und die Speicher und lädt die Kostenzyklen so viel Speicher und mehr Zyklen für mich, um es mit Speicher zu tun. Jemand anderes mag gute Tricks haben. Ich denke, einige der neueren Kerne haben eine Endian-Swap-Anweisung, die es noch einfacher machen würde.
.globl midswap
midswap:
mov r2,r0,lsl #8 ;@ r2 = BBCCDDAA
mov r3,r0,lsr #8 ;@ r3 = DDAABBCC (this might drag a sign bit, dont care)
and r2,r2,#0x00FF0000 ;@ r2 = 00CC0000
and r3,r3,#0x0000FF00 ;@ r3 = 0000BB00
bic r0,r0,#0x00FF0000 ;@ r0 = AA00CCDD
bic r0,r0,#0x0000FF00 ;@ r0 = AA0000DD
orr r0,r0,r2 ;@ r0 = AACC00DD
orr r0,r0,r3 ;@ r0 = AACCBBDD
bx lr ;@ or mov pc,lr for older arm cores
.globl tworegs
tworegs:
mov r2,r0,ror #8 ;@ r2 = DDAABBCC
bic r2,r2,#0xFF000000 ;@ r2 = 00AABBCC
bic r2,r2,#0x00FF0000 ;@ r2 = 0000BBCC
orr r2,r2,ror #16 ;@ r2 = BBCCBBCC
bic r2,r2,#0xFF000000 ;@ r2 = 00CCBBCC
bic r2,r2,#0x000000FF ;@ r2 = 00CCBB00
bic r0,r0,#0x00FF0000 ;@ r0 = AA00CCDD
bic r0,r0,#0x0000FF00 ;@ r0 = AA0000DD
orr r0,r0,r2 ;@ r0 = AACCBBDD
bx lr
testfun:
ldr r0,=0xAABBCCDD
bl midswap
Uh machen, ist nicht, dass 32-Bit-Konstanten, im ersten Beispiel? Verwirrend. – unwind
Ja, das sind 32-Bit-Konstanten, aber wenn man genauer hinschaut, werden nur 8 aufeinanderfolgende Bits in ihren Konstanten verwendet. ARM kann 8 Bits machen, aber die Position dieser kann frei in den gewünschten Ort gedreht werden. Der Assembler ist intelligent genug, um die Konstanten für Sie zu kodieren. –
jeder * sogar * Ort, den Sie wollen; 0x1fe ist zum Beispiel kein direkt darstellbares, aber 0x3fc ist. –