LDR/STR
- LDR:從記憶體載入資料到單一暫存器
- STR:從單一暫存器的值存回記憶體
LDR R1, [R0] // R1 = *R0,從位址 R0 載入到 R1
STR R1, [R0] // *R0 = R1, 把 R1 寫到位址 R0
LDR R0, [R1], #8 // R0 = *R1 then R1 = R1 + 8
STR R0, [R1], #-8 // *R1 = R0 then R1 = R1 - 8
VERIFY_LOOP ldr r3, [r1], #4 ; Read longword from DRAM. 把*r1存到r3 ,r1+4
ldr r4, [r2], #4 ; Read longword from flash. 把*r2存到r4 ,r2+4
cmp r3, r4 ; Compare. 比較一不ㄧ樣
bne VERIFY_FAILURE ; Not the same? Fail. 不ㄧ樣就跳到錯誤的地方
subs r0, r0, #4 ; 再把r0-4
bne VERIFY_LOOP ; Continue?如果r0不等於0就繼續比較
目的: 驗證dram與 flash內的資料是ㄧ樣的
LDM/STM
- LDM: 從記憶體載入多筆資料到一般用途暫存器
- STM: 多個暫存器的資料在一個指令下寫回記憶體
•LDM R0, {R1-R4,PC} // R1 = * R0
// R2 = *(R0+4)
// R3 = *(R0+8)
// R4 = *(R0+12)
// PC = *(R0+16)
•STM R0, {R1-R4,LR} // *R0 = R1
// *(R0+4) = R2
// *(R0+8) = R3
// *(R0+12) = R4
// *(R0+16) = LR
- LDM 和 STM 實際上常會配合定址法來作堆疊的資料管理,一般用法上會搭配 R13 來作堆疊指標,當然也可以利用其他暫存器
- 根據前面提過的指令編碼欄位的位元組合,可以有四種定址模式
•Full Ascending (FA)
指令為 LDMFA/STRFA,代表堆疊往高位址的記憶體空間成長,而基底暫存器指到堆疊最頂端的有效資料位址
•Full Descending (FD)
指令為 LDMFD/STRFD,代表堆疊往低位址的記憶體空間下降,而基底暫存器指到堆疊最底端的有效資料位址
•Empty Ascending (EA)
指令為 LDMEA/STREA,代表堆疊往高位址的記憶體空間成長,而基底暫存器指到堆疊最頂端有效資料欄位再往上的空資料位址
•Empty Descending (ED)
指令為 LDMED/STRED,代表堆疊往低位址的記憶體空間下降,而基底暫存器指到堆疊最底端有效資料欄位再往下的空資料位址
; Do 4x32-bit block copies from flash->RAM (corrupts r4-r7).
;
10 ldmia r8!, {r4-r7} ; Loads from flash (post increment). 把資料由r8的位址讀出後存到r4,地址加0x04,再讀出再存到r5,地址再加0x04,再讀出再存到r6,地址再加0x04,再讀出再存到r7
stmia r1!, {r4-r7} ; Stores to RAM (post increment). 把r4的資料存到r1所指的位置,r5存到r1所指位置加0x04依序~
subs r2, r2, #1 ; 看搬完了嗎
bne %B10 ; Done?如果沒有 繼續回到Lable 10
留言列表