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

相关推荐
liuluyang5309 小时前
ARM DStream仿真器脚本常用命令
arm开发·dstream
沉在嵌入式的鱼1 天前
使用nomachine远程连接ARM设备桌面
arm开发·rk3588·远程连接·nomachine
进击的程序汪2 天前
Linux 启动过程流程图--ARM版
linux·运维·arm开发
比奇堡在逃帅哥11 天前
硬件-DAY04(ds18b20、ARM内核)
arm开发
Ronin-Lotus12 天前
微处理器原理与应用篇---ARM常见汇编指令
汇编·arm开发·微处理原理与应用
切糕师学AI12 天前
半导体行业中的专用标准产品ASSP是什么?
arm开发·嵌入式硬件·嵌入式·计算机体系结构
Svan.13 天前
Portable Watch:基于STM32的便携智能手表
arm开发·驱动开发·stm32·嵌入式硬件·硬件工程·pcb工艺·智能手表
凉、介14 天前
CPU Cache 的映射与寻址
linux·arm开发·数据库·redis·缓存·嵌入式
学渣6765614 天前
单片机开发日志cv MDK-ARM工具链迁移到MAKE
arm开发·单片机·嵌入式硬件
ldinvicible14 天前
基于ARM ubuntu如何进行交叉编译
arm开发·数据库·ubuntu