基础概念
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