ARM Assembly 6: Shift 和 Rotate

基础概念

LSL(Logical Shift Left)

  • 功能: 将寄存器中的位向左移动,右边用零填充。左移相当于对二进制数进行乘以2的幂的操作。

  • 语法: LSL{S} Rd, Rn, #shamt

    • Rd: 结果存储的目标寄存器。

    • Rn: 要进行位移的源寄存器。

    • #shamt: 位移的位数(立即数)。

    • S: 可选,若存在则更新条件标志。

      MOV R0, #0b00000001 ; R0 = 1
      LSL R1, R0, #2 ; R1 = R0 << 2,结果为0b00000100,即4

LSR(Logical Shift Right)

  • 功能: 将寄存器中的位向右移动,左边用零填充。右移相当于对二进制数进行除以2的幂的操作。

  • 语法: LSR{S} Rd, Rn, #shamt

    • Rd: 结果存储的目标寄存器。

    • Rn: 要进行位移的源寄存器。

    • #shamt: 位移的位数(立即数)。

    • S: 可选,若存在则更新条件标志。

lsl/r会改变数字的sign,因为它会向端侧添加0

MOV R0, #0b00001000   ; R0 = 8
LSR R1, R0, #2        ; R1 = R0 >> 2,结果为0b00000010,即2

ASR(Arithmetic Shift Right)

  • 功能: 将寄存器中的位向右移动,同时保持符号位(最高有效位)的值。左侧的空位用符号位填充。这种操作通常用于有符号整数的除法。

  • 语法: ASR{S} Rd, Rn, #shamt

    • Rd: 结果存储的目标寄存器。

    • Rn: 要进行位移的源寄存器。

    • #shamt: 位移的位数(立即数)。

    • S: 可选,若存在则更新条件标志。

      MOV R0, #-8 ; R0 = 0b11111000 (假设为8位表示)
      ASR R1, R0, #2 ; R1 = R0 >> 2,结果为0b11111110,即-2

ASL(Arithmetic Shift Left)

  • 功能: 在ARM汇编中,ASL通常与LSL(Logical Shift Left)等效,因为左移操作不影响符号位。左移操作将寄存器中的位向左移动,右边用零填充。

  • 语法: LSL{S} Rd, Rn, #shamt(通常用LSL代替ASL)

知识点

  • 符号位保持: ASR在右移时保持符号位不变,这对于处理有符号整数非常重要。

  • 立即数: 位移的位数通常是一个立即数,表示要移动的位数。

  • 条件标志: 使用S后缀(如ASRS)可以更新条件标志,这对于条件执行非常有用。

  • 性能: 位移操作通常比乘法和除法更高效,因此在需要快速计算时非常有用。

使用场景: encryption/decryption

相关推荐
汽车电子助手4 小时前
【STM32开发环境搭建】-4-在STM32CubeMX中新增Keil(MDK-ARM) 5的工程目录(包含指定路径的C和H文件)
c语言·arm开发·stm32·stm32cubemx·keil
htx nb12 小时前
ARM 架构、cpu
arm开发
极客小张1 天前
基于STM32的远程工业控制系统架构设计:MQTT通信、React界面与FreeRTOS优化的综合应用
c语言·arm开发·stm32·物联网·算法·react.js·毕业设计
勾栏听曲_01 天前
ARM6818开发板画任意矩形,圆形,三角形,五角星,6818开发板画太极,画五星红旗(含码源与思路)
c语言·arm开发·单片机·嵌入式硬件·硬件工程
吃饭只吃七分饱1 天前
ARM点灯---看手册
arm开发
码农老李3 天前
飞腾CPU运行RTEMS6.0
arm开发
汽车电子助手4 天前
【STM32开发环境搭建】-3-STM32CubeMX Project Manager配置-自动生成一个Keil(MDK-ARM) 5的工程
arm开发·stm32·嵌入式硬件·stm32cubemx·keil
Crazy learner4 天前
深入了解 Ne10:优化 ARM 处理器的数字信号处理库
arm开发·信号处理
Frank Castle5 天前
windows+vscode+arm-gcc+openocd+daplink开发arm单片机程序
arm开发·vscode·单片机