ARMv8汇编中的MOV,MOVZ,MOVN和MOVK有什么区别?

时间:2018-11-12 18:34:26

标签: arm armv8

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

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

1 个答案:

答案 0 :(得分:2)

MOV

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

*这些是64位原型。

MOVZ和MOVK

这两个有时有时一个接一个地使用。它们用于移动立即数。 MOVZ将立即数(16位值)移至寄存器,并且该立即数之外的所有其他位均设置为零。可以将立即数向左移0、16、32或48。MOVK移动并立即取值,但保持寄存器的其他位不变。例如,假设您需要将此值移动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通常用于移动位掩码,假设您要将位掩码0xffffffff0000ffff移至x0,然后将0xffff移至左侧16,这将使值变为0x00000000fffff0000,但是如果取反该值,它将变为0xffffffff0000ffff

这里是一个例子:

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