We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
I am targeting a Cortex-M0 processor, and am new to Thumb assembly available on the M0. Is there more efficient way to swap two bytes in a 32-bit word (in this example, the middle two bytes)? Thanks!
LDR R0, =0xAABBCCDD LDR R1, =0x00FF0000 LDR R2, =0x0000FF00 MOV R3, R0 MOV R4, R0 ANDS R3, R1 ANDS R4, R2 BICS R0, R1 BICS R0, R2 LSRS R3, #8 LSLS R4, #8 ORRS R0, R3 ORRS R0, R4
LDR R0, =0xAABBCCDD
LDR R1, =0x00FF0000
LDR R2, =0x0000FF00
MOV R3, R0
MOV R4, R0
ANDS R3, R1
ANDS R4, R2
BICS R0, R1
BICS R0, R2
LSRS R3, #8
LSLS R4, #8
ORRS R0, R3
ORRS R0, R4
Sensei, I was able to get it to 6 instructions using REV :-) Thank you!
LDR R0, =0xAABBCCDDLDR R1, =0x00FFFF00REV R2, R0 // R2 0xDDCCBBAAANDS R2, R1 // R2 0x00CCBB00BICS R0, R1 // R0 0xAA0000DDORRS R0, R2 // R0 0xAACCBBDD
Neat. Don't think it can be shorter.
Here is my version, which avoids the literal loading:
.text .thumb .thumb_func ldr r0,=0xaabbccdd bl swap swap: lsls r1,r0,#8 // r1 = bbccdd00 lsrs r1,r1,#16 // r1 = 00bbccdd lsls r1,r1,#8 // r1 = 00bbcc00 eors r0,r1 // r0 = aa0000dd rev16 r1,r1 // r1 = bb0000cc movs r2,#16 rors r1,r2 // r1 = 00ccbb00 orrs r0,r1 // r0 = aaccbbdd bx lr