在ARM程序集中从十六进制值加载double

时间:2014-02-06 20:17:24

标签: assembly arm label double word

我正在尝试从标签加载float的十六进制值。我将它存储在标签中,因为它是一个常量值,我不想计算每次调用函数。

我发现这样做是这样的:

x0:  // sqrt(3/5)
    .word 0x3ada5b53
    .word 0x0342423

// And then later down the road do this:
fldd d0,x0;

可悲的是,似乎行不通。我该怎么做呢?或者更容易存储这些值的方法是什么?存储十六进制值对我来说似乎是最精确的方法,但因为它无法使用它。

1 个答案:

答案 0 :(得分:2)

根据“后来在路上”的确切时间长短,如果它拒绝组装(或链接),您可能会达到可以加载的距离的极限。来自some documentation

  

标签必须在当前指令的±1KB范围内的字边界上对齐。

对于MOV

armasm VLDR r, =const pseudo-op,它会根据需要生成自动立即/文字加载,并且通常会确保文字保持适当的近距离。 GNU as 似乎没有这个,但是如果您手动安排标签足够接近,则使用.double.word定义数据会生成相应的代码:< / p>

data1:  .double 0.774596669241483377
        vldr.f64 d0, data1    @ UAL syntax for fldd

data2:  .word   0xf43f7248
        .word   0x3fe8c97e
        vldr.f64 d1, data2

给出:

Disassembly of section .text:

00000000 <data1>:
   0:   f43f7248        .word   0xf43f7248
   4:   3fe8c97e        .word   0x3fe8c97e
   8:   ed1f0b04        vldr    d0, [pc, #-16]  ; 0 <data1>

0000000c <data2>:
   c:   f43f7248        .word   0xf43f7248
  10:   3fe8c97e        .word   0x3fe8c97e
  14:   ed1f1b04        vldr    d1, [pc, #-16]  ; c <data2>

这让我怀疑它“似乎不起作用”的另一个原因,因为sqrt(3/5)的价值看起来相当错误。