遇到MOVZ时,我正在使用反汇编程序,这有点困惑,因为我以前只使用过MOV。
ARMv8 ISA手册当然会解释所有详细信息,并且MOV是其他三个别名的别名,具体取决于上下文,但是也许有人可以在此处提供一些基本原理,并提供具体示例以加快学习过程。
答案 0 :(得分:2)
该指令可以采用多种形式,具体取决于需要移动的值。如果值是寄存器或立即数,则更改。如果在寄存器中,则产生ORR指令(ORR <Xd>, XZR, <Wm>
)*;如果在使用SP(堆栈指针),则产生ADD(ADD <Xd|XSP>, <Xn|XSP>, #0
)*。如果要移动立即数,则使用的是MOVZ,MOVK或MOVN指令之一。
*这些是64位原型。
这两个有时有时一个接一个地使用。它们用于移动立即数。 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通常用于移动位掩码,假设您要将位掩码0xffffffff0000ffff移至x0,然后将0xffff移至左侧16,这将使值变为0x00000000fffff0000,但是如果取反该值,它将变为0xffffffff0000ffff
这里是一个例子:
instruction value of x0
MOVN x0, 0xFFFF, lsl 16 | 0xffffffff0000ffff