Shifting and Rotating

# 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 #

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

``````

## Shifts #

### 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
``````