H mmm, nie wiem co się stało, przedłożyłem moją odpowiedź, zanim naprawdę zacząłem.
Na początku nie sądziłem, że mogę to zrobić tylko z dwoma rejestrami, ale potem zdecydowałem, że mogę i zrobiłem. Rozwiązania te są tylko rejestrem, bez pamięci (inne niż ldr r0, = które można zastąpić czterema instrukcjami). Jeśli używasz pamięci i hmmm, dwa rejestry możesz zmniejszyć liczbę instrukcji być może: str, bic, bic, ldrb, orr lsl, ldrb, orr lsl. Okay Zrobiłem to w jednej instrukcji mniej, ale potem potrzebujesz miejsca w pamięci i cykli kosztowych sklepów i obciążeń, tyle samo pamięci i więcej cykli, aby zrobić to z pamięcią. Ktoś inny może mieć dobre sztuczki. Myślę, że niektóre z nowszych rdzeni mają instrukcję zamiany końcówek, co jeszcze bardziej ułatwiłoby pracę.
.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, nie jest to, że za pomocą 32-bitowych stałych, w pierwszym przykładzie? Mylące. – unwind
Tak, są to stałe 32-bitowe, ale jeśli przyjrzeć się bliżej, mają tylko 8 kolejnych bitów używanych w ich stałych. ARM może wykonać 8 bitów, ale ich położenie można dowolnie obracać w wybrane miejsce. Asembler jest wystarczająco inteligentny, aby zakodować dla ciebie stałe. –
dowolne * nawet * miejsce, które chcesz; 0x1fe nie jest reprezentowalny natychmiast, na przykład, ale 0x3fc jest. –