[学习资料] 移位操作

[复制链接]
1409|11
 楼主| 小小蚂蚁举千斤 发表于 2023-12-26 08:35 | 显示全部楼层 |阅读模式

ARM微处理器支持数据的移位操作,移位操作在ARM指令集中不作为单独的指令使用,它只能作为指令格式中是一个字段,在汇编语言中表示为指令中的选项。移位操作包括如下6种类型,ASL和LSL是等价的,可以自由互换:

1) LSL(或ASL)逻辑(算术)左移
寻址格式:

  1. 通用寄存器,LSL(或ASL) 操作数   

完成对通用寄存器中的内容进行逻辑(或算术)的左移操作,按操作数所指定的数量向左移位,低位用零来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。如:

  1. MOV    R0, R1, LSL#2  ;将R1中的内容左移两位后传送到R0中。


 楼主| 小小蚂蚁举千斤 发表于 2023-12-26 08:36 | 显示全部楼层
2) LSR逻辑右移
寻址格式:

  1. 通用寄存器,LSR 操作数

完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用零来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。如:

  1. MOV    R0, R1, LSR #2  ;将R1中的内容右移两位后传送到R0中,左端用零来填充。

3) ASR算术右移
寻址格式:

  1. 通用寄存器,ASR 操作数     

完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用第31位的值来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。如:

  1. MOV    R0, R1, ASR #2  ;将R1中的内容右移两位后传送到R0中,左端用第31位的值来填充。

4) ROR循环右移
寻址格式:

  1. 通用寄存器,ROR 操作数     

完成对通用寄存器中的内容进行循环右移的操作,按操作数所指定的数量向右循环移位,左端用右端移出的位来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。显然,当进行32位的循环右移操作时,通用寄存器中的值不改变。如:

  1. MOV    R0, R1, ROR #2  ;将R1中的内容循环右移两位后传送到R0中。


 楼主| 小小蚂蚁举千斤 发表于 2023-12-26 08:37 | 显示全部楼层
5) RRX带扩展的循环右移
寻址格式:

  1. 通用寄存器,RRX 操作数   
  
完成对通用寄存器中的内容进行带扩展的循环右移的操作,按操作数所指定的数量向右循环移位,左端用进位标志位C来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。如:

  1. MOV    R0, R1, RRX #2  ;将R1中的内容进行带扩展的循环右移两位后传送到R0中。

举例
  1. ; 第二操作数 寄存器移位操作, 5种移位方式, 9种语法
  2. ;逻辑左移
  3. mov r0, #0x1
  4. mov r1, r0, lsl #1    ; 移位位数1-31肯定合法

  5. mov r0, #0x2
  6. mov r1, r0, lsr #1    ; 逻辑右移

  7. mov r0, #0xffffffff
  8. mov r1, r0, asr #1    ; 算术右移符号位不变, 次高位补符号位

  9. mov r0, #0x7fffffff
  10. mov r1, r0, asr #1

  11.     mov r0, #0x7fffffff
  12. mov r1, r0, ror #1 ; 循环右移

  13.     mov r0, #0xffffffff
  14. mov r1, r0, rrx ; 唯一不需要指定循环位数的移位方式
  15. ;带扩展的循环右移
  16. ;C标志位进入最高位,最低位进入C 标志位

  17. ; 移位值可以是另一个寄存器的值低5bit, 写法如下
  18. mov r2, #1
  19. mov r0, #0x1
  20. mov r1, r0, lsl r2    ; 移位位数1-31肯定合法

  21. mov r0, #0xffffffff
  22. mov r1, r0, asr r2    ; 算术右移符号位不变, 次高位补符号位

  23. mov r0, #0x7fffffff
  24. mov r1, r0, asr r2

  25.     mov r0, #0x7fffffff
  26. mov r1, r0, ror r2 ; 循环右移

上述结果不再截图,读者可以自行拷贝到keil中进行debug,查看寄存器中值以及符号位的变化。

drawingchips 发表于 2023-12-26 09:08 | 显示全部楼层
移位操作属于汇编,比C语言效率要高很多。
答案很长吧 发表于 2023-12-26 09:30 | 显示全部楼层
移位操作是不是就是乘除法的操作?
嵌入小菜菜 发表于 2023-12-26 11:49 | 显示全部楼层
乘除就可以直接用移位操作吧?
勇者无惧你和我 发表于 2023-12-26 16:17 | 显示全部楼层
移位的操作,就是乘除法的关系。
亚瑟 发表于 2023-12-29 10:39 来自手机 | 显示全部楼层
不是只能计算2的倍数吗
jflahdink09 发表于 2023-12-29 11:35 | 显示全部楼层
移位操作,就是乘除法的操作。
ynndmalh21 发表于 2023-12-29 12:04 | 显示全部楼层
移位的操作,就是乘除法的操作吧。
真爱吴迪迪 发表于 2023-12-29 12:28 | 显示全部楼层
这个就是加减乘除法的事情了。
mxkw0514 发表于 2023-12-29 15:34 | 显示全部楼层
现在汇编还用吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

233

主题

2711

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部