星期四, 2月 19, 2009

ldm stm

在使用 stm / ldm 實作 Stack 時,發現先前追程式碼時,太過輕率而忽略掉一些細節,假設大家都了解 stmia / stmib / stmda / stmdb 及 ldmdb / ldmda / ldmib / ldmia 指令的語法與實際意義。
r0=0x32001000
r1=0x09
r2=0x08
r3=0x07

stmib r0!, {r1-r3}
ldmda r0!, {r1-r3}
在執行完 ldmda 後,我認為暫存器 (r1,r2,r3) 的值分別是 (7,8,9),也就是會 Reverse,這樣既符合 Stack 的精神(FILO)也符合該指令的定義,但實際的結果是 (r1,r2,r3) = (9,8,7)



問題出在哪裡呢,直到這裡的一句話,一切的疑問都解開了。

「Remember that registers are always stored lowest at lowest address」翻成白話文的意思為「編號較小的暫存器會存到較低的記憶體位址」或「較低的記憶體位址內容會載入到編號較小的暫存器」

所以 (r1,r2,r3) = (9,8,7) 這樣的結果是沒有問題的,看 ldmda 指令,r3 相較於 r1,r2 是編號大的暫存器,因此會將較高的記憶體位址的內容寫入到 r3 裡。



再看一個例子,按照前面的原則思考,注意記憶體位址及暫存器編號的關係。