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--是一個意思。
不妥之處請各位指教。