Shifting and Rotating #
Shifting and rotating refer to the process of taking the bits of a number and moving them either to the left or the right. The ARM processor has a barrel shifter included in the hardware which allows you to shift the flexible operand2.
Rotating is the operation where when bits get to the end of the register, they move to the other side. There are two rotate instructions.
ROR operation #
mov r0, #0b11001100 @ r0 = 00000000 00000000 00000000 11111111 ror r0, r0, #2 @ shift to the right 2 @ r0 = 11000000 00000000 00000000 00111111
RRX operation #
The RRX operation functions exactly like ROR, but instead of a 32-bit register, it treats the carry flag in the CPSR as a 33rd bit. It, however, can only move one bit at a time.
mov r0, #0b11001100 @ r0 = 00000000 00000000 00000000 11111111 C = 0 rrx r0, r0 @ shift to the right 1 @ r0 = 00000000 00000000 00000000 01111111 C = 1 @ if carry were 1 during move operation, it would @ have ended up in bit 31
Logical shifts #
The logical shift right (LSR) and logical shift left (LSL) shift bits and move the last removed flag to the carry bit of the CPSR if the s suffix is added.
mov r0, #0xff00ff00 @ r0 = 11111111 00000000 11111111 00000000 C=0 lsls r0, r0, #10 @ r0 = 00000011 11111100 00000000 00000000 C=0 mov r1, #0xff00ff00 @ r0 = 11111111 00000000 11111111 00000000 C=0 lsrs r1, r1, #10 @ r0 = 00000000 00111111 11000000 00111111 C=1
Arithmetic shift #
You may see the problem with shifting – it always moves zeros into the register. If you are still thinking about negative numbers, you can see why this would be an issue. If you add a zero to the front of a “negative” number, then it’s not “negative” anymore. Because of this, there is also a arithmetic shift right (ASR) which will preserve the sign by copying the 31st bit and not just zero.
mov r0, #-23 @ r0 = 11111111 11111111 11111111 11101001 C=0 asr r0, r0, #4 @ r0 = 11111111 11111111 11111111 11111110 C=1