ARM Assembly(04)-Rotate and Barrel Shifter

本文对ARM汇编中的旋转和移位操作进行介绍

Barrel Shifter

ARM有两种移位

  • logical:逻辑移位,用于无符号操作数

  • arithmetic:算术移位,用于符号操作数

LSR

LSR指令是逻辑右移指令,与MOV结合完成移位操作

1
MOV Rd,Rn,LSR Op2

以上指令将Rn右移Op2个bit位,结果放入Rd中。该指令是带进位的移位操作,bit[0]移出后会进位到C中,高位补零,Op2可以是一个立即数或者寄存器

LSR可以用于计算2的幂次除法

LSL

LSL指令是逻辑左移指令,与MOV结合完成移位操作

1
MOV Rd,Rn,LSL Op2

LSL指令与LSR指令相反,移位后,高位进入C中,低位补零

Rotate

ROR

ROR指令是右旋指令,也是与MOV结合使用

1
MOV Rd,Rn,ROR Op2

以上指令将Rn寄存器右旋Op2个bit,结果放入Rd。右旋过程中数据的最低位进位到C,同时补到数据的最高位,而不是补零,如下图所示

没有ROL左旋指令,可以使用ROR完成左旋

RRX

RRX指令用于带进位右旋

1
MOV Rd,Rn,RRX

注意RRX指令每次只能移位1bit。RRX移位的过程可以将32位寄存器和进位C看作一个33bit的数的右旋