2017-01-09 638 views
0

我發現在我的ARMv5裝配這樣的指令:ARM彙編 - 使用大括號

pop  {r2} ; (str r2, [sp, #-4]!) 
push {r0} ; (str r0, [sp, #-4]!) 
push {r4, r5, r6, r7, r8, r9, sl, lr} 

我的理解是push和pop是首字母縮略詞爲STRLDR,這些指令存儲和加載多個寄存器因此,我認爲,在這種情況下,大括號表示「設置寄存器存儲或裝載」

是我的假設是正確的?

+0

聽起來像它。 – fuz

+0

不要假設,閱讀參考手冊。 – Jester

+0

一個不使用S.O.要麼? –

回答

2

好的,只需閱讀指令集文檔。彙編程序可以選擇使用str/ldr或stm/ldm作爲單個寄存器推送和彈出。現在,您希望將堆棧保持在64位邊界上,所以通常會推送或彈出偶數個寄存器,但是如果必須的話,您可以一次執行一個。對於拇指推/彈出是他們自己的指令,而不是加載或存儲的編碼。

00000000 <.text>: 
    0: e49d2004 pop {r2}  ; (ldr r2, [sp], #4) 
    4: e52d0004 push {r0}  ; (str r0, [sp, #-4]!) 
    8: e92d40f0 push {r4, r5, r6, r7, lr} 

00000000 <.text>: 
    0: bc04  pop {r2} 
    2: b401  push {r0} 
    4: b5f0  push {r4, r5, r6, r7, lr} 

在這種情況下,ARM編碼似乎的確是加載/存儲不僅僅是反彙編註釋(x4xxxxxx)LDM/STM是x8xxxxxx編碼像最後一個。

所有這些當然都在這些ARM文檔中,這些文檔可以回答您的問題以及其他您可能遇到的問題。如果可以找出每個答案,那麼確保stackoverflow可以是無用的。但在這種情況下,您正在檢查顯示語法的一些參考,即相同的參考應該有一些附加文本顯示寄存器列表是一個集合。編碼中分別有15位或9位,並且有幾個簡單的例子,您可以看到編碼與您在語法中指定的列表相匹配。

是的花括號意味着推動他們所有人或彈出他們所有的視情況而定。該文檔還包括設置以及哪些寄存器被放在內存中什麼樣的順序,是從

push {r4,r2,r3} 

push {r2,r3,r4} 

不同例如

還要注意原來還有後增量前減量沒有推/拉指令,它們與非ldm/stm的真正的推/拉拇指指令一起出現(因爲它們沒有足夠的位來刻錄r13被指定爲16位中的4位,它們具有的ldm/stm是限於r0-r7)。同樣,你必須爲三個寄存器操作指定所有三個寄存器,稍後彙編器讓你懶惰,讓你使用拇指語法來進行arm指令,然後最終得到統一的語法,這使得事情變得更加複雜。

最重要的是要記住,彙編語言通常不是標準化的。他們只能通過特定的彙編程序定義您正在使用的閱讀文本的程序,有人可以輕易讓這

push (r1,r2) 
pop [r3,r4] 
push r2,r3,r4,r5 
str r3,r2 

在他們的彙編合法的語法。只要看看相同指令集的arm工具和gnu工具之間的區別。與傳統的pdp-11語法相比,查看pdp-11 gnu彙編語法更有趣。 (是的,有一個維護的pdp-11後端)。

所以你的問題本來應該更具體,你用什麼彙編,儘管我們非常知道你在問什麼。

+0

當我問這個問題時,我期待着一個簡單的「是或否」的答案。但是你超越了這個,今天我學到了很多東西,我不知道彙編語言不是標準的。非常感謝。 –