我遇到了障碍,不知道该去哪里。我知道MOV最多只能存储十进制的0-65535。但是,我要存储的值是 30,402,460。
我打算使用 MVN 作为一些源提及,可以以这种格式存储更大的数字: MVN X9,#(编号),#(编号)。然而 30402460 / 110 = 仅等于 276,386,仍然高于十进制值 65535,所以我无法使用 MVN。
我的问题是;我们如何将 30402460 存储到 X9?
MOV
不是真正的指令。它是一个别名,将根据需要转换为 MOVZ
、MOVN
或 ORR
。但每个都有自己的限制:
MOVZ
可以加载任意16位,左移0、16、32或48位。因此,您只能将其用于 48 位全零的值。MOVN
与MOVZ
相同,但反转寄存器值。因此,您只能将其用于所有至少 48 位的值。ORR
可以构造一个非常复杂的位掩码,据我所知,它可以是任何连续运行的零、一、零或一、零、一的序列,按 2 的除数的任何幂重复寄存器宽度。因此,您可以加载 0xaaaaaaaaaaaaaaaa
、0xfffffff00fffffff
和 0x18
等值,但不能加载 0x0
或 0x5
等值。值 30402460 与这些约束都不匹配。加载此类值的通常做法是使用
MOVZ
,然后使用 MOVK
,后者允许替换寄存器的 16 位而不更改其他位。所以在你的情况下:
movz x9, 0x1cf, lsl 16
movk x9, 0xe79c
另一种可能性是写
ldr x9, =30402460
汇编器会将值
30402460
存储在代码附近的某个位置,然后将该内存加载到寄存器 x9
中。您可以使用任何您想要的常数。
您可以选择使用最多四个算术指令还是从内存中读取一次。