Хммм, не знаю, что случилось, он отправил мой ответ, прежде чем я действительно начал.
Сначала я не думал, что смогу сделать это только с двумя регистрами, но потом решил, что смогу и сделал. Эти решения только для регистров, без памяти (кроме ldr r0, = который можно заменить четырьмя инструкциями). Если вы используете память и хммм, два регистра, вы можете сократить количество инструкций, возможно, str, bic, bic, ldrb, orr lsl, ldrb, orr lsl. Хорошо, я сделал это за одну инструкцию меньше, но тогда вам понадобится место в памяти, а также циклы затрат на хранение и загрузку, так же количество памяти и больше циклов для меня, чтобы сделать это с памятью. У кого-то еще могут быть хорошие трюки. Я думаю, что у некоторых из новых ядер есть инструкция подстановки с порядком байтов, которая сделает это еще проще.
.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