4.3.12. ASR、LSL、LSR、ROR 和 RRX

算术右移、逻辑左移、逻辑右移、向右循环移和带扩展向右循环移。

这些指令与带有移位寄存器第二操作数的 MOV 功能相同。

语法

op{S}{cond} Rd, Rm, Rs
op{S}{cond} Rd, Rm, #sh
RRX{S}{cond} Rd, Rm

其中:

op

ASRLSLLSRROR 之一。

S

是一个可选的后缀。 如果指定 S,则会更新运算结果的条件代码标记(请参阅条件执行)。

Rd

是目标寄存器。

Rm

是存放第一个操作数的寄存器。 此操作数将会被右移。

Rs

是存放移位值的寄存器,所存放的移位值应用于 Rm 中的值。 只使用最低有效字节。

sh

为一个常数移位值。 该值的允许范围由具体指令决定:

ASR

允许移动 1-32 位

LSL

允许移动 0-31 位

LSR

允许移动 1-32 位

ROR

允许移动 1-31 位

用法

ASR 提供除以 2 的幂后的寄存器内容的有符号值。 它可将符号位复制到左侧空出的位中。

LSL 提供乘以 2 的幂后的寄存器内容的值。LSR 提供除以 2 的可变次幂后的寄存器内容的无符号值。 这两个指令均会向空出的位中插入零。

ROR 可提供按某个值循环移位后的寄存器内容的值。 从右端移出的位将会被插入到左侧空出的位中。

RRX 可提供经右移一位后的寄存器中的值。 原先的进位标记将会移入位 [31]。 如果有 S 后缀,则将原先的位 [0] 存入进位标记中。

限制

使用 Rs 的 ARM 指令不得使用 r15。 Thumb 指令不得使用 r15 或 r13。

条件标记

如果指定了 S,则这些指令将会根据结果来更新 N 和 Z 标记。

如果移位值为 0,则不会影响 C 标记。否则,C 标记会更新为移出的最后一位。

16 位指令

这些指令的下列形式可用于 Thumb-2 之前的 Thumb 代码中,在 Thumb-2 代码中使用时为 16 位指令:

ASRS Rd, Rm, #sh

RdRm 必须都是 Lo 寄存器。

ASRS Rd, Rd, Rs

RdRs 必须都是 Lo 寄存器。

LSLS Rd, Rm, #sh

RdRm 必须都是 Lo 寄存器。

LSLS Rd, Rd, Rs

RdRs 必须都是 Lo 寄存器。

LSRS Rd, Rm, #sh

RdRm 必须都是 Lo 寄存器。

LSRS Rd, Rd, Rs

RdRs 必须都是 Lo 寄存器。

RORS Rd, Rd, Rs

RdRs 必须都是 Lo 寄存器。

示例

    ASR     r7, r8, r9
    LSLS    r1, r2, r3
    LSR     r4, r5, r6
    ROR     r4, r5, r6
Copyright © 2002-2008 ARM Limited. All rights reserved.ARM DUI 0204IC
Non-Confidential