2010-07-15 173 views
3

我正在使用llvm-clang編譯器,將簡單的C函數編譯到ARMv7-A處理器上進行彙編。我想弄清楚這個指令的功能。ARM SUB指令操作數

SUB sp, sp, #65, 30 

顯然,這是在做一些局部變量堆棧指針的房間,但我從來沒有見過四個操作數的ARM SUB指令。我猜測30以某種方式修改了#65,但我不知道如何,而且我還沒有能夠在「ARM體系結構參考手冊」中找到詳細信息。有什麼建議麼?

對於好奇,這是在一個程序的開始,創建一個8×8的整數矩陣,所以我希望該sp需要爲堆棧上至少8 x 8 x 4字節的空間。

回答

7

30是在65

旋轉右30比特循環右移操作是相同的旋轉左2 bitswhich相同一個乘以4 65 * 4 = 260

所以這從堆棧指針中減去260。

+0

感謝您的快速回復。任何想到爲什麼會有一個立即移位而不是僅僅是數字260(ARM指令指定立即數爲12位寬,對於常數260足夠明顯)? – Zeke 2010-07-15 20:37:42

+0

@Zeke:馬丁的回答明白了爲什麼 – 2010-07-15 23:21:29

4

手臂設計爲立即值分配12位,值爲8位,並且剩餘4位是向右旋轉(表示旋轉0 2 4等位置)。由於260不能被表示爲8位,其構造爲65 * 4。

此展開可用的立即值給程序員在整個32位範圍,而不是將其限制爲0到4095

1

ARM的分解器有時以這種格式作爲8位常數+ 4-吐出常數bit ROR編碼允許一些值以不同的方式編碼。例如1可以被編碼爲1 ROR 0,4 ROR 2,16 ROR 4等

解碼爲這種格式允許指令編碼明確指定,並允許重新組合指令編碼。建立一個按位相同的二進制可能很重要。

+1

我不知道這是一種可用的格式,但是當試圖設計可以以可預測的方式修補的代碼時,這會很有幫助。例如,如果時序敏感例程需要添加數字0-65535,則可以在其中一個上使用左移8(右移24)的兩個添加立即指令。這比在加載之前必須從內存加載16位值要快得多。 – supercat 2011-02-16 19:23:56