我们如何在 ARM 中存储大的十进制/十六进制值?

问题描述 投票:0回答:2

我遇到了障碍,不知道该去哪里。我知道MOV最多只能存储十进制的0-65535。但是,我要存储的值是 30,402,460。

我打算使用 MVN 作为一些源提及,可以以这种格式存储更大的数字: MVN X9,#(编号),#(编号)。然而 30402460 / 110 = 仅等于 276,386,仍然高于十进制值 65535,所以我无法使用 MVN。

我的问题是;我们如何将 30402460 存储到 X9?

arm64
2个回答
2
投票

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

0
投票

另一种可能性是写

ldr x9, =30402460

汇编器会将值

30402460
存储在代码附近的某个位置,然后将该内存加载到寄存器
x9
中。您可以使用任何您想要的常数。

您可以选择使用最多四个算术指令还是从内存中读取一次。

© www.soinside.com 2019 - 2024. All rights reserved.