ARM中的STM/LDM指令

STM/LDM是批量傳輸數據的指令,這裏要說明的是[15:0]Register list代表了16個寄存器,傳輸數據的時候R15始終是最後傳輸的,按照從R0到R15的順序,R15始終在高地址。

 

遞增傳輸倒好理解,關鍵是遞減傳輸,2440的datasheet令我費解,看看datasheet裏的一張圖

假設Rn = R0, R0 = 0x1000,STMDB  R0!, { R1, R5, R7 }這樣一條指令,先存儲R1,執行之後R0的值是多少?圖上並沒有標註,並不能按照R0 -= 4, [R0] = R1, R0 -= 4, [R0] = R4, R0 -= 4, [R0] = R7這種方式來理解,如果按照R7,R5,R1的順序來存儲就好理解了,但datasheet上這樣說:

             The registers are transferred in the order lowest to highest, so R15 (if in the list) will always be transferred last.

這句話讓我頭大,反正堅持一個原則,讓R0-R15從低地址到高地址排,不把這條指令分解就OK了。

    另外要說的就是滿棧和空棧,滿棧就是說SP的位置始終指向棧頂,而空棧是說SP的位置始終指向棧中一個空的位置,其實滿棧遞增/遞減跟++i/--i是一個意思,而空棧遞增/遞減跟i++/i--是一個意思。

 

    不妥之處請各位指教。

 

發佈了52 篇原創文章 · 獲贊 17 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章