2014-02-06 95 views
1

我試圖從標籤加載float的十六進制值。我將它存儲在標籤中,因爲它是一個常數值,我不想計算對函數的每次調用。在ARM彙編中從十六進制值加載double

我找到了在做這樣的:

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

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

可惜這種情況似乎不起作用。我會如何去做這件事?或者什麼是更容易的方法來存儲這些值?存儲十六進制值似乎是對我來說最精確的方法,但因爲它無法使用它。

回答

2

根據「稍後在路上」的確切時間長短,如果它拒絕組裝(或鏈接),則可能會達到您可以加載多遠的限制。從some documentation

標籤必須在當前指令的±1KB內的字邊界上對齊。

armasm的具有作爲用於MOV,產生一個自動即時/文字加載適當的和通常確保文字保持通過適當地接近一個VLDR r, =const pseudo-op。 GNU 似乎並不具備這一點,但只要您手動安排標籤足夠接近,無論使用哪種.double.word定義數據生成相應的代碼:

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)的值看起來相當錯誤。