ARM指令集的移位操作

       ARM 微处理器内嵌的桶型移位器(Barrel Shifter),支持数据的各种移位操作,移位操作在 ARM 指令集中不作为单独的指令使用,它只能作为指令格式中是一个字段,在汇编语言中表示为指令中的选项。
       例如,数据处理指令的第二个操作数为寄存器时,就可以加入移位操作选项对它进行各种移位操作。移位操作包括如下6 种类型, ASL 和 LSL 是等价的,可以自由互换:
— LSL 逻辑左移
— LSR 逻辑右移
— ASL 算术左移等价于LSL
— ASR 算术右移
— ROR 循环右移
— RRX 带扩展的循环右移
 
1、LSL(或ASL)操作
LSL(或ASL)操作的格式为:
通用寄存器, LSL (或 ASL ) 操作数
LSL(或ASL)可完成对通用寄存器中的内容进行逻辑(或算术)的左移操作,按操作数
所指定的数量向左移位,低位用零来填充。其中,操作数可以是通用寄存器,也可以是立即数( 0 ~ 31 )。
操作示例:
MOV R0, R1, LSL#2 ;将 R1 中的内容左移两位后传送到 R0 中。
 
2、LSR 操作
LSR 操作的格式为:
通用寄存器, LSR 操作数
LSR 可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用零来填充。其中,操作数可以是通用寄存器,也可以是立即数( 0 ~ 31 )。
操作示例:
MOV R0, R1, LSR#2 ;将 R1 中的内容右移两位后传送到 R0 中,左端用零来填充。
 
3、ASR 操作
ASR 操作的格式为:
通用寄存器, ASR 操作数
ASR 可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用第31 位的值来填充。其中,操作数可以是通用寄存器,也可以是立即数( 0 ~ 31 )。
操作示例:
MOV R0, R1, ASR#2 ;将 R1 中的内容右移两位后传送到 R0 中,左端用第 31 位的值来填充。
 
4、ROR 操作
ROR 操作的格式为:
通用寄存器, ROR 操作数
ROR 可完成对通用寄存器中的内容进行循环右移的操作,按操作数所指定的数量向右循环移位, 左端用右端移出的位来填充。其中,操作数可以是通用寄存器,也可以是立即数( 0 ~ 31 )。显然,当进行 32 位的循环右移操作时,通用寄存器中的值不改变。
操作示例:
MOV R0, R1, ROR#2 ;将 R1 中的内容循环右移两位后传送到 R0 中。
 
5、RRX 操作
RRX 操作的格式为:
通用寄存器, RRX 操作数
RRX 可完成对通用寄存器中的内容进行带扩展的循环右移的操作,按操作数所指定的数量向右循环移位,左端用进位标志位 C 来填充。其中,操作数可以是通用寄存器,也可以是立即数( 0 ~ 31 )。
操作示例:
MOV R0, R1, RRX#2 ;将 R1 中的内容进行带扩展的循环右移两位后传送到 R0 中。

追加:
mov r0, #0x7fffffff
lsl r1, r0, #2
r1 = (r0 << 2)
lsl逻辑左移 高位移出 低位补零
lsr r1, r0, #2
lsr逻辑右移 低位移出 高位补零
asr r1, r0, #16
asr 算数右移 低位移出 高位补符号位
asl 算数左移 高位移出 低位补零等价于lsl
ror r2, r1, #4
ror循环右移 低位移出 高位补低位
mov r1, r2, lsl #4
r1 = (r2 << 4)
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值