我们如何在 ARM 中存储大的 decimal/hex 值?
How do we store large decimal/hex value in ARMs?
我 运行 遇到路障,不知道从这里去哪里。我知道 MOV 最多只能存储十进制的 0-65535。但是,我要存储的值是 30,402,460。
我打算使用 MVN 作为一些来源提到的可以以这种格式存储更大的数字:
MVN X9,#(数量),#(数量)。但是 30402460 / 110 = 只等于 276,386,它仍然高于 65535 的十进制值,所以我不能使用 MVN。
我的问题是;我们如何将 30402460 存储到 X9?
MOV
不是真正的指令。它是一个别名,将根据需要变成 MOVK
、MOVN
或 ORR
。但是每个都有自己的限制:
MOVZ
可以加载任意 16 位,左移 0、16、32 或 48 位。所以你只能将它用于具有 48 位全零的值。
MOVN
与 MOVZ
的作用相同,但会反转寄存器值。所以你只能将它用于至少有 48 位的值。
ORR
可以构造一个非常复杂的位掩码,据我所知,它可以是连续运行的零、一、零或一、零、一的任意序列,由二是寄存器宽度的除数。因此,您可以加载 0xaaaaaaaaaaaaaaaa
、0xfffffff00fffffff
和 0x18
等值,但不能加载 0x0
或 0x5
. 等值
值 30402460 与这些约束中的 none 匹配。加载此类值的通常做法是使用 MOVZ
后跟 MOVK
,后者允许替换寄存器的 16 位而不更改其他位。所以在你的情况下:
movz x9, 0x1cf, lsl 16
movk x9, 0xe79c
我 运行 遇到路障,不知道从这里去哪里。我知道 MOV 最多只能存储十进制的 0-65535。但是,我要存储的值是 30,402,460。
我打算使用 MVN 作为一些来源提到的可以以这种格式存储更大的数字: MVN X9,#(数量),#(数量)。但是 30402460 / 110 = 只等于 276,386,它仍然高于 65535 的十进制值,所以我不能使用 MVN。
我的问题是;我们如何将 30402460 存储到 X9?
MOV
不是真正的指令。它是一个别名,将根据需要变成 MOVK
、MOVN
或 ORR
。但是每个都有自己的限制:
MOVZ
可以加载任意 16 位,左移 0、16、32 或 48 位。所以你只能将它用于具有 48 位全零的值。MOVN
与MOVZ
的作用相同,但会反转寄存器值。所以你只能将它用于至少有 48 位的值。ORR
可以构造一个非常复杂的位掩码,据我所知,它可以是连续运行的零、一、零或一、零、一的任意序列,由二是寄存器宽度的除数。因此,您可以加载0xaaaaaaaaaaaaaaaa
、0xfffffff00fffffff
和0x18
等值,但不能加载0x0
或0x5
. 等值
值 30402460 与这些约束中的 none 匹配。加载此类值的通常做法是使用 MOVZ
后跟 MOVK
,后者允许替换寄存器的 16 位而不更改其他位。所以在你的情况下:
movz x9, 0x1cf, lsl 16
movk x9, 0xe79c