【问题标题】:What's the difference between MOV, MOVZ, MOVN and MOVK in ARMv8 assembly?ARMv8 汇编中的 MOV、MOVZ、MOVN 和 MOVK 有什么区别?
【发布时间】:2019-04-15 12:36:50
【问题描述】:

遇到MOVZ时我正在使用反汇编程序并且有点困惑,因为我之前只使用过MOV。

ARMv8 ISA 手册当然解释了所有细节,并且 MOV 是其他三个的别名,具体取决于上下文,但也许有人可以在这里提供一些基本原理,并给出具体示例以加快学习过程。

【问题讨论】:

  • 你的手册是什么? infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0802a/… 用很短的方式描述了这些差异,所以我有点困惑你在寻找什么。
  • @domen developer.arm.com/docs/ddi0487/latest/… 似乎好一点。但我猜它一定在某个地方。
  • 我想我不明白你的问题。 movz - Move shifted 16-bit immediate to register. 然后:movn - Move inverse of shifted 16-bit immediate to register. 你想要多短?
  • @domen 我认为可以向新用户解释即时的编码,并说明为什么我们需要这三种编码类型。
  • @Close voters:你能解释一下理由吗? SO上有成千上万的汇编问题,所以它似乎是一个成熟的话题。您可能应该打开一个元帖子,而不是一劳永逸地为所有这些人做出决定,而不是一一进行近距离投票。

标签: arm armv8


【解决方案1】:

移动

此指令可以采用多种形式,具体取决于需要移动的值。如果值是寄存器或立即数,它会改变。如果它在寄存器中,那么它会产生一个ORR 指令 (ORR <Xd>, XZR, <Wm>)*。如果它使用SP(堆栈指针),它会产生一个ADD指令(ADD <Xd|XSP>, <Xn|XSP>, #0)*。如果移动立即数,则它是 MOVZ、MOVK 或 MOVN 指令之一。

*这些是 64 位原型。 XZR 是零寄存器,其值始终为零。 XZRSP 共享由相同的数字 (31) 标识,这就是为什么当 SP 是目标或操作数时不能使用 ORR 指令的原因。而是使用ADD 指令。

MOVZ 和 MOVK

这两条指令有时一个接一个地使用。 它们用于移动即时值。 MOVZ 将立即值(16 位值)移动到寄存器中,立即值之外的所有其他位都设置为零。立即数可以向左移动0163248MOVK 移动一个立即数,但保持寄存器的其他位不变(K 用于保留)。例如,假设您需要将此值0x7fb7fb1f88 移动到注册x0。首先,您将使用 MOVZ 指令移动前 16 位(位 0 到 15),因此寄存器的其余位设置为零。然后您将使用MOVK 指令移动第二个 16 位(第 16 位到第 31 位),因此之前移动的值(前 16 位)保留在寄存器中,并且您对其他剩余位执行相同操作。

      instruction                     value of x0
mov    x0, #0x1f88           |        0x1f88
movk   x0, #0xb7fb, lsl #16  |        0xb7fb1f88
movk   x0, #0x7f, lsl #32    |        0x7fb7fb1f88 

MOVN

MOVN 通常用于移动位掩码,这里N 代表否定。假设您要将位掩码0xffffffff0000ffff 移动到x0。 然后您将移动0xffff 向左移动 16,这将使值 0x00000000ffff0000。否定这个值变成 0xffffffff0000ffff。

这是一个例子:

      instruction                     value of x0
MOVN x0, 0xFFFF, lsl 16       |       0xffffffff0000ffff

【讨论】:

    猜你喜欢
    • 2010-12-14
    • 2017-05-05
    • 2013-11-12
    • 2016-05-17
    • 1970-01-01
    • 2018-06-23
    相关资源
    最近更新 更多