r0=0x32001000在執行完 ldmda 後,我認為暫存器 (r1,r2,r3) 的值分別是 (7,8,9),也就是會 Reverse,這樣既符合 Stack 的精神(FILO)也符合該指令的定義,但實際的結果是 (r1,r2,r3) = (9,8,7)
r1=0x09
r2=0x08
r3=0x07
stmib r0!, {r1-r3}
ldmda r0!, {r1-r3}
問題出在哪裡呢,直到這裡的一句話,一切的疑問都解開了。
「Remember that registers are always stored lowest at lowest address」翻成白話文的意思為「編號較小的暫存器會存到較低的記憶體位址」或「較低的記憶體位址內容會載入到編號較小的暫存器」
所以 (r1,r2,r3) = (9,8,7) 這樣的結果是沒有問題的,看 ldmda 指令,r3 相較於 r1,r2 是編號大的暫存器,因此會將較高的記憶體位址的內容寫入到 r3 裡。
再看一個例子,按照前面的原則思考,注意記憶體位址及暫存器編號的關係。
沒有留言:
張貼留言