文章目录
概要
下表为移位指令的汇编程序和一条指令所需要的周期数:
序号 | 描述 | 汇编程序 | 所需要的机器周期 |
1 | Logical shift left by immediate | LSLS Rd,Rm,#<shift1> | 1 |
2 | Logical shift left by register | LSLS Rd,Rd,Rs | 1 |
3 | Logical shift right by immediate | LSRS Rd,Rm,#<shift2> | 1 |
4 | Logical shift right by register | LSRS Rd,Rd,Rs | 1 |
5 | Arithmetic shift right | ASRS Rd,Rm,#<shift3> | 1 |
6 | Arithmetic shift right by register | ASRS Rd,Rd,Rs | 1 |
7 | Rotate right by register | RORS Rd,Rd,Rs | 1 |
注:1、所有指令的Rd、Rs和Rm只能是R0-R7寄存器中的一个
2、#<shift>移位的长度,ASR的长度取值1-32,LSL的长度取值0-31,LSR的长度1-32
3、逻辑右移和算数右移的区别:逻辑右移不考虑符号位,左边补零;算数右移需要考虑符号位,若符号位为1,则左边补1,否则补0
举例说明
1、LSLS Rd,Rm,#<shift1> 将寄存器 Rm 中的数据向左移动立即数#<shift1>,移位的结果保存在寄存器 Rd 中,即:Rd=Rm<<#shift1。在左移过程中,最后移出去的位保存在寄存器 APSR的C标志中,并更新N和Z标志。
MOVS R1,#0X3
LSLS R0,R1,#31
仿真如下,一个时钟周期后,将0X3左移31位复制到寄存器R0中,此时N、C标志位置位
2、LSLS Rd,Rd,Rs 将寄存器 Rd 中的数据向左移动寄存器Rs,移位的结果保存在寄存器 Rd 中,即:Rd=Rd<<Rs。在左移过程中,最后移出去的位保存在寄存器 APSR 的C标志中,并更新 N 和Z标志
MOVS R1,#0X3
MOVS R2,#0X3
LSLS R1,R1,R2
仿真如下,一个时钟周期后,将0X3左移3位复制到寄存器R1中
3、LSRS Rd,Rm,#<shift2> 将寄存器 Rm 中的数据向右移动立即数#<shift2>,移位的结果保存在寄存器 Rd 中,即:Rd=Rm>>#shift2。在右移过程中,最后移出去的位保存在寄存器 APSR的C标志中,并更新N和Z标志
MOVS R1,#0X3
LSRS R0,R1,#2
仿真如下,一个时钟周期后,将0X3右移2位复制到寄存器R0中,此时Z、C标志位置位
4、LSRS Rd,Rd,Rs 将寄存器 Rd 中的数据向右移动 Rs 所指定的次数移位的,结果保存在寄存器 Rd 中,即:Rd=Rd>>Rs。在右移过程中,最后移出去的位保存在寄存器 APSR 的C标志中,并更新 N 和Z标志
MOVS R1,#0X12
MOVS R2,#0X3
LSRS R1,R1,R2
仿真如下,一个时钟周期后,将0X12右移3位复制到寄存器R1中
5、ASRS Rd,Rm,#<shift3> 将寄存器 Rm 中的数据算术右移立即数#<shift3>,移位的结果保存在寄存器 Rd 中,即:Rd=Rm>>#shift3。在右移过程中,最后移出去的位保存在寄存器 APSR的C标志中,并更新N和Z标志
MOVS R1,#0X1
LSLS R0,R1,#31
LSRS R0,R0,R1 ;逻辑右移
LSLS R0,R1,#31
ASRS R0,R0,R1 ;算术右移
仿真如下,0X80000000逻辑右移的结果为0X40000000,0X80000000算术右移的结果为0XC0000000
6、ASRS Rd,Rd,Rs 将寄存器 Rd 中的数据算术右移 Rs 所指定的次数移位的,结果保存在寄存器 Rd 中,即:Rd=Rd>>Rs。在右移过程中,最后移出去的位保存在寄存器 APSR 的C标志中,并更新 N 和Z标志
MOVS R1,#0X3
MOVS R2,#0X1
LSLS R1,R1,R2
仿真如下,0X3算术右移1位得到0X1,此时C(进位标志)置1
7、RORS Rd,Rd,Rs 保存在寄存器 Rd 中的数据向右循环移动 Rm 所指定的次数,移位的结果保存在寄存器 Rd中。在循环右移过程中,最后移出去的位保存在寄存器 APSR的C标志中,并更新N和Z标志
MOVS R1,#0X3
MOVS R2,#0X1
RORS R1,R1,R2
仿真如下:0X3循环右移1位,最低位1移动到最高位,得到结果0X80000001