4.3.7. MOV 和 MVN

移动和取反移动。

语法

MOV{S}{cond} Rd, Operand2
MOV{cond} Rd, #imm16
MVN{S}{cond} Rd, Operand2

其中:

S

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

cond

是一个可选的条件代码(请参阅条件执行)。

Rd

是目标寄存器。

Operand2

是一个灵活的第二操作数。 有关此选项的详细信息,请参阅灵活的第二操作数

imm16

可为 0-65535 范围内的任一个值。

用法

MOV 指令可将 Operand2 中的值复制到 Rd 中。

MVN 指令先获取 Operand2 的值,然后对该值按位进行逻辑“非”运算,最后会将结果存入 Rd

在某些情况下,汇编器可能会用 MOV 替换 MVNMVN 替换 MOV。 阅读反汇编列表时请注意这一点。 有关详细信息,请参阅指令替换

在 Thumb-2 MOV 和 MVN 中使用 pc

在 Thumb-2 MOVMVN 指令中,不能将 pc (r15) 用于 Rd,也不能将其用在 Operand2 中。

在 ARM MOV 和 MVN 中使用 pc

Note

MOV Rd,Rm 的语法允许将 pc 用于 Rd,或将 pc 用于 Rn,但二者不能都为 pc。 不提倡使用所有其他用法。

如果将 pc 用作 Rd,则所用的值为指令地址加 8。

如果将 pc 用作 Rd,则:

  • 代码将跳转到与结果相对应的地址执行。

  • 如果使用 S 后缀,则当前模式的 SPSR 会复制到 CPSR。 您可利用此机制从异常中返回(请参阅《开发指南》中的第 6 章 处理处理器异常)。

Caution

在用户模式和系统模式下,若是将 pc 用作 Rd,则不要使用 S 后缀。 此类指令的结果不可预知,而且汇编器在汇编时不会发出警告。

在所有由寄存器控制移位的数据处理指令中,都不能将 pc 用于 Rd 或任何操作数(请参阅灵活的第二操作数)。

条件标记

如果指定了 S,则这些指令将:

  • 根据结果来更新 N 和 Z 标记。

  • Operand2 的计算过程中更新 C 标记(请参阅灵活的第二操作数

  • 不影响 V 标记。

16 位指令

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

MOVS Rd, #imm

Rd 必须是 Lo 寄存器。 imm 范围为 0-255。

MOVS Rd, Rm

RdRm 必须都是 Lo 寄存器。

MOV Rd, Rm

在 ARMv5 及更低版本中,Rd 和/或 Rm 必须是 Hi 寄存器。 在 ARMv6 及更高版本中,没有此限制。

体系结构

#imm16 形式的 ARM 指令可用于 ARMv6T2 及更高版本。 该 ARM 指令的其他形式可用于所有版本的 ARM 体系结构中。

这些 32 位 Thumb 指令可用于 ARMv6T2 及更高版本。

这些 16 位 Thumb 指令可用于 ARM 体系结构的所有 T 变体中。

示例

    MVNNE   r11, #0xF000000B ; ARM only. This constant is not available in T2.

不正确的示例

    MVN     pc,r3,ASR r0     ; pc not permitted with register controlled shift
Copyright © 2002-2008 ARM Limited. All rights reserved.ARM DUI 0204IC
Non-Confidential