移位
LSL
ASL
LSR
ASR
ROR
RRX
ARM 处理器组建了能够与数据处理指令(ADC、ADD、AND、BIC、CMN、CMP、EOR、MOV、MVN、ORR、RSB、SBC、SUB、TEQ、TST)一同运用的桶式移位器(barrel shifter)。你还能够运用桶式移位器影响在 LDR/STR 操作中的变址值。
译注:移位操作在 ARM 指令会集不作为独自的指令运用,它是指令格局中是一个字段,在汇编语言中表明为指令中的选项。假如数据处理指令的第二个操作数或许单一数据传送指令中的变址是寄存器,则能够对它进行各种移位操作。假如数据处理指令的第二个操作数是当即值,在指令顶用 8 位当即值和 4 位循环移位来表明它,所以对大于 255 的当即值,汇编器测验经过在指令中设置循环移位数量来表明它,假如不能表明则生成一个过错。在逻辑类指令中,逻辑运算指令由指令中 S 位的设置或铲除来确认是否影响进位标志,而比较指令的 S 位总是设置的。在单一数据传送指令中指定移位的数量只能用当即值而不能用寄存器。
下面是给不同的移位类型的六个助记符:
LSL 逻辑左移 ASL 算术左移 LSR 逻辑右移 ASR 算术右移 ROR 循环右移 RRX 带扩展的循环右移
ASL 和 LSL 是同等的,能够自在交换。
你能够用一个当即值(从 0 到 31)指定移位数量,或用包含在 0 和 31 之间的一个值的寄存器指定移位数量。
逻辑或算术左移
(Logical or Arithmetic Shift Left)
Rx, LSL #n or Rx, ASL #n or Rx, LSL Rn or Rx, ASL Rn
承受 Rx 的内容并按用‘n’或在寄存器 Rn 中指定的数量向高有用位方向移位。最低有用位用零来填充。除了概念上的第 33 位(便是被移出的最小的那位)之外丢掉移出最左端的高位,假如逻辑类指令中 S 位被设置了,则此位将成为从桶式移位器退出时进位标志的值。
考虑下列:
MOV R1, #12 MOV R0, R1, LSL#2
在退出时,R0 是 48。 这些指令构成的总和是 R0 = #12, LSL#2 同等于 BASIC 的 R0 = 12 << 2
逻辑右移
(Logical Shift Right)
Rx, LSR #n or Rx, LSR Rn
它在概念上与左移相对。把一切位向更低有用位方向移动。假如逻辑类指令中 S 位被设置了,则把最终被移出最右端的那位放置到进位标志中。它同于 BASIC 的 register = value >>> shift。
算术右移
(Arithmetic Shift Right)
Rx, ASR #n or Rx, ASR Rn
类似于 LSR,但运用要被移位的寄存器(Rx)的第 31 位的值来填充高位,用来维护补码表明中的符号。假如逻辑类指令中 S 位被设置了,则把最终被移出最右端的那位放置到进位标志中。它同于 BASIC 的 register = value >> shift。
循环右移
(Rotate Right)
Rx, ROR #n or Rx, ROR Rn
循环右移类似于逻辑右移,可是把从右侧移出去的位放置到左边,假如逻辑类指令中 S 位被设置了,则一起放置到进位标志中,这便是位的‘循环’。一个移位量为 32 的操作将导致输出与输入完全一致,由于一切位都被移位了 32 个方位,又回到了开始时的方位!
带扩展的循环右移
(Rotate Right with extend)
Rx, RRX
这是一个 ROR#0 操作,它向右移动一个方位 – 不同之处是,它运用处理器的进位标志来供给一个要被移位的 33 位的数量。