我發現在我的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是首字母縮略詞爲STR
和LDR
,這些指令存儲和加載多個寄存器因此,我認爲,在這種情況下,大括號表示「設置寄存器存儲或裝載」
是我的假設是正確的?
我發現在我的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是首字母縮略詞爲STR
和LDR
,這些指令存儲和加載多個寄存器因此,我認爲,在這種情況下,大括號表示「設置寄存器存儲或裝載」
是我的假設是正確的?
好的,只需閱讀指令集文檔。彙編程序可以選擇使用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後端)。
所以你的問題本來應該更具體,你用什麼彙編,儘管我們非常知道你在問什麼。
當我問這個問題時,我期待着一個簡單的「是或否」的答案。但是你超越了這個,今天我學到了很多東西,我不知道彙編語言不是標準的。非常感謝。 –
聽起來像它。 – fuz
不要假設,閱讀參考手冊。 – Jester
一個不使用S.O.要麼? –