2011-08-12 66 views
2

我試圖重建下述片臂拆卸的在C++:浮點臂拆卸說明

00003188 ed910a06 flds s0, [r1, #24] 
0000318c edd10a07 flds s1, [r1, #28] 
00003190 ec800a02 fstmias r0, {s0-s1} 
00003194  4770 bx lr 
00003196  bf00 nop 

首先,S0是一個單一的進動寄存器? flsl和fstmias做了什麼。我嘗試了下面的代碼,但它不會產生相同的結果:

float s0 = r1[6]; 
float s1 = r1[7]; 

我試過了什麼?

+0

[fstmias](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc。 dui0068b/Bcfchhif.html)在由'r0'(IA =增量地址)指定的地址存儲單精度數字。所以你需要'r0 [0] = s0; (或者'mem [r0] = s0; mem [r0 + 4] = s1;'我不知道周圍的代碼是怎麼樣的)。 – user786653

+0

@ user786653:你爲什麼不把它作爲答案?如果你還可以解釋'bx lr'部分,你就可以覆蓋一切。 –

回答

4

由於這是一個非常微不足道的功能,讓我們一行一行。我會假設你發佈了完整的函數。

00003188 ed910a06 flds s0, [r1, #24] 

FLDS是這個形式: 「FLD <精度> {COND}的Fd,[Rn中{,#offset}]」,具有精度爲S(=單精度)。正如文檔所述,這會將位於r1 + 24的單精度浮點值加載到s0中。

0000318c edd10a07 flds s1, [r1, #28] 

而另一負載,此時距離r1 + 28(這相當於你r1[7]寫什麼)。

00003190 ec800a02 fstmias r0, {s0-s1} 

FSTMIAS名單 「FSTM <addressmode> <精密> {} COND Rn中,{!} VFPregisters」。這裏你有addressmode = IA,這意味着「每次傳輸後遞增地址」和precision = single。該指令將指定的寄存器存儲到r0中指定的地址。在每次存儲後遞增地址。換句話說,它存儲s0[r0]s1[r0+4]

00003194  4770 bx lr 

BX是分支(並且任選地變回ARM模式)寄存器值 - 從函數返回的優選方式(見第5.1節here)。在這種情況下,寄存器是保存返回地址的鏈接寄存器。

00003196  bf00 nop 

無操作。什麼都不做,通常插入在內存中對齊函數。

ARM-THUMB的calling convention(4.1節)指出前四個參數在r0-r3(== a1-a4)中傳遞,我們可以從反彙編中看到使用了r0和r1, 2個參數。目前還不清楚該函數是否返回一個值(與第一個輸入相同)或不返回值。你將不得不看看通話網站來弄清楚。

在C語言中,我們有一個函數,它將兩個指針值作爲輸入,從第二個參數的偏移量24和28加載兩個float,並將它們存儲在第一個偏移量0和4中。如果沒有進一步的程序知識,就不可能知道參數是否應該是數組,結構或其他。

假設它們是陣列翻譯到C是微不足道:

void mystery_function(float* dst, const float* src) { 
    dst[0] = src[6]; 
    dst[1] = src[7]; 
} 
+0

優秀的答案。 –