我们如何在 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 不是真正的指令。它是一个别名,将根据需要变成 MOVKMOVNORR。但是每个都有自己的限制:

  • MOVZ 可以加载任意 16 位,左移 0、16、32 或 48 位。所以你只能将它用于具有 48 位全零的值。
  • MOVNMOVZ 的作用相同,但会反转寄存器值。所以你只能将它用于至少有 48 位的值。
  • ORR 可以构造一个非常复杂的位掩码,据我所知,它可以是连续运行的零、一、零或一、零、一的任意序列,由二是寄存器宽度的除数。因此,您可以加载 0xaaaaaaaaaaaaaaaa0xfffffff00fffffff0x18 等值,但不能加载 0x00x5.
  • 等值

值 30402460 与这些约束中的 none 匹配。加载此类值的通常做法是使用 MOVZ 后跟 MOVK,后者允许替换寄存器的 16 位而不更改其他位。所以在你的情况下:

movz x9, 0x1cf, lsl 16
movk x9, 0xe79c