ARM指令中STM和LDM的理解誤

2021-06-21 22:43:10 字數 990 閱讀 2070

這個講的挺詳細的

arm指令中stm和ldm的理解誤區

hopeangel

stm和ldm的主要用途是現場保護、資料複製、引數傳遞等,其模式有8種,如下:

注:前面4種用於資料塊的傳輸,後面4種用於堆疊操作

(1)ia  每次傳送後位址加4

(2)ib  每次傳送前位址加4

(3)da  每次傳送後位址減4

(4)db  每次傳送前位址減4

(5)fd  滿遞減堆疊

(6)fa  滿遞增堆疊

(7)ed  空遞減堆疊

(8)ea  空遞增堆疊

下面的講述對於空遞減堆疊和空遞增堆疊同樣適用.

在堆疊操作時,經常錯誤以為使用stmfd滿遞減將暫存器壓入堆疊後,在彈出資料的時候應該使用ldmfa。

但是fd和fa僅用於只是目前操作的堆疊是何種模式(堆疊共有四種模式),fd指明目前的堆疊是滿遞減堆疊,

則資料入棧時的指令為stmfd,那麼資料出棧時的指令對應的為ldmfd,而不是ldmfa。

我們可以這樣認為stmfd等價於s***b,ldmfd等價於stmia

那麼,資料傳輸的順序和資料入棧的順序又是如何呢

先來看stmfd sp!,  執行的結果圖(操作之後sp指向sp')

sp------->

|r3|

|r2|

sp'------>|r1|

那麼stmfd sp!,執行後的堆疊順序是不是剛好和上面的堆疊順序相反,實際情況時這兩個指令執行後的堆疊資料順序一樣,因為arm編譯器會自動將stmfd sp!,轉換為stmfd sp!,指令,也就是說,arm編譯器預設高暫存器優先存入堆疊。即便你在指令stmfd sp!,中刻意「安排」了暫存器入棧順序,而在編譯時編譯器又重新做了處理,打亂了你期望的資料入棧順序。

同理s***b r0!,和s***b r0!,指令執行後資料在堆疊中的順序完全一致。

stmfd sp!,指令對應的出棧指令是ldmfd sp!,(r1,r2,r3的順序任意)

arm中的飽和指令

armv6 及更高版本中推出了飽和指令 ssat 和 usat,ssat16 和 usat16 有符號飽和到任何位位置和無符號飽和到任何位位置,可選擇在飽和前進行移位。ssat可將有符號值飽和到有符號範圍內。usat可將有符號值飽和到無符號範圍內。語法 oprd,sat,rm其中 op 是ssat或...

ARM中的STM LDM指令

stm ldm是批量傳輸資料的指令,這裡要說明的是 15 0 register list代表了16個暫存器,傳輸資料的時候r15始終是最後傳輸的,按照從r0到r15的順序,r15始終在高位址。遞增傳輸倒好理解,關鍵是遞減傳輸,2440的datasheet令我費解,看看datasheet裡的一張圖 假...

ARM中的跳轉指令

arm中的跳轉指令 arm中b bl bx blx指令的區別 用於實現程式流程的跳轉,在arm程式中有兩種方法可以實現程式流程的跳 使用專門的跳轉指令 直接向程式計數器pc寫入跳轉位址值 通過向程式計數器pc寫入跳轉位址值,可以實現在4gb的位址空間中的任意跳轉,在跳轉之前結合使用 mov lr,p...