stm/ldm是批量傳輸資料的指令,這裡要說明的是[15:0]register list代表了16個暫存器,傳輸資料的時候r15始終是最後傳輸的,按照從r0到r15的順序,r15始終在高位址。
遞增傳輸倒好理解,關鍵是遞減傳輸,2440的datasheet令我費解,看看datasheet裡的一張圖
假設rn = r0, r0 = 0x1000,s***b r0!, 這樣一條指令,先儲存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--是乙個意思。
不妥之處請各位指教。
arm中的飽和指令
armv6 及更高版本中推出了飽和指令 ssat 和 usat,ssat16 和 usat16 有符號飽和到任何位位置和無符號飽和到任何位位置,可選擇在飽和前進行移位。ssat可將有符號值飽和到有符號範圍內。usat可將有符號值飽和到無符號範圍內。語法 oprd,sat,rm其中 op 是ssat或...
ARM中的跳轉指令
arm中的跳轉指令 arm中b bl bx blx指令的區別 用於實現程式流程的跳轉,在arm程式中有兩種方法可以實現程式流程的跳 使用專門的跳轉指令 直接向程式計數器pc寫入跳轉位址值 通過向程式計數器pc寫入跳轉位址值,可以實現在4gb的位址空間中的任意跳轉,在跳轉之前結合使用 mov lr,p...
arm中的B指令
參考 b指令是相對跳轉指令,是根據當前pc暫存器的值加上偏移來實現跳轉的,所以它和 在記憶體中的位置無關。但是我們在檢視彙編檔案的時候,經常會有種錯覺,它好像是按絕對位址進行跳轉的,因為b指令的形式是 b label 即跳轉到label處進行執行,label這個標籤明顯是絕對位址啊。其實在彙編語句翻...