arm assembly 指令 筆記

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

arrow
arrow
    全站熱搜

    huenlil 發表在 痞客邦 留言(0) 人氣()