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的数的右旋