我正在尝试从标签加载float的十六进制值。我将它存储在标签中,因为它是一个常量值,我不想计算每次调用函数。
我发现这样做是这样的:
x0: // sqrt(3/5)
.word 0x3ada5b53
.word 0x0342423
// And then later down the road do this:
fldd d0,x0;
可悲的是,似乎行不通。我该怎么做呢?或者更容易存储这些值的方法是什么?存储十六进制值对我来说似乎是最精确的方法,但因为它无法使用它。
答案 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)
的价值看起来相当错误。