ARM 匯編 內存訪問指令


 

 

一。 單個寄存器操作讀寫內存

內存訪問指令格式:<opcode><cond> Rd, [Rn]

  Rn 中保存的是一個內存的地址值

1. 內存寫指令  【 str,strb,strh 】單個寄存器

  1) 【 str 】寫 4 個字節

ldr r0, =0x12345678      @ 
mov r1, #0x40000000
str r0, [r1]   @ 將r0中的數據寫入 r1 指向的內存中; str寫4個字節

 2)【 strb 】寫 1 個字節

strh r0, [r1]  @ 把 r0 中的低字節,寫入 r1 指向的低地址中

 

 3) 【 strh 】 寫 2 個字節

strh r0, [r1]   @ 把 r0 中的 低2個字節,寫入 r1指向的 2個低地址中

 

 

 

2. 讀內存指令 【 ldr,ldrb,ldrh 】 單個寄存器

  1) 【 ldr 】 讀 4 個字節

ldr r0, =0x12345678   @ 此處 ldr 是偽指令, ldr 還可以是讀內存的指令
mov r1, #0x40000000
str r0, [r1]                  @ 先把r0 中的數據寫到r1指向的地址中
ldr r2, [r1]         @ 讀取 r1 指向的地址中的數據,讀取 4 個字節

 

  2)【 ldrb 】 讀 1 個 字節

ldrb r3, [r1]  @ 讀 1個字節, 讀低位

  3)【 ldrh 】讀 2 個字節

ldrh r4, [r1]  @ 讀取低 2 位 的2 個字節

 

 二. 操作多個寄存器讀寫內存 【 寫內存: stm , 讀內存: ldm 】

 指令格式 : <opcode><cond> Rn{!} {register_list}

  Rn 中保存一個 內存地址值

  {!} 表示是否更新 Rn 中的地址值

  {register_list} 寄存器列表

1. 【 stm 】 多個寄存器中的值寫入內存中

mov r0, #0x40000000
ldr r1, =0x11111111
ldr r2, =0x22222222
ldr r3, =0x33333333
ldr r4, =0x44444444
stm r0!, {r1,r2,r3,r4}   @ 把 此條指令改為 stm r0,{r1,r2,r3,r4} 不會更新r0中的地址值

 

 對於多個寄存器的操作指令【stm】說明:

(1)加 ! 表示更新 r0 中的地址值

(2)寄存器列表中是連續的寄存器可以用 - 連接 如 {r1,  r2,  r3,  r4,  r6} 可以表示為 {r1-r4, r6}

(3)編號曉得寄存器數據,保存到低地址中

(4)編號大的寄存器數據,保存到高地址中

 

 2. 操作多個寄存器 讀內存數據

mov r0, #0x40000000
ldr r1, =0x11111111
ldr r2, =0x22222222
ldr r3, =0x33333333
stm r0, {r1-r3}  @把寄存器 r1-r3 中的值寫入 r0 指向的內存地址中

ldm r0!, {r5-r7} @讀出r0指向的內存地址中的放在寄存器 r5-r7 中

 

 三。棧操作指令 【入棧: stmfd,出棧:ldmfd 】

棧的 4 種特性 Full滿棧     Empty空棧      Ascend增棧     Descend降棧

組合 4 種棧:

      stmfa   fa   滿   增

   stmfd   fd    滿   降   ARM 匯編默認使用

   stmea  ea   空   增

   stmed  ed    空   減

  指令格式:<opcode><cond> sp!  {register_list}     : sp 堆棧指針 r14

ldr sp, =0x40000100   @初始化棧指針
ldr r1, =0x11111111
ldr r2, =0x22222222
ldr r3, =0x33333333

stmfd sp!, {r1-r3}    @把數據 入棧 到sp指向的地址, 增滿棧類型, sp指針跟着更新
ldmfd sp!, {r4-r6}   @出棧, 把棧內數據彈出到 r4-r6寄存器中

出棧時只是把數據 , 彈出到相應的寄存器中去 , 並沒有把 棧指針指向的數據清空 所以還可以看到相應的地址中有數據 , 使用局部變量不初始化 , 就會得到一個 隨機的數據

 

例子:

 1    ldr sp, =0x40000100  @初始化棧指針
 2    mov r0, #0x12
 3    mov r1, #0x11
 4    bl add_fun
 5    mov r2, #0x22
 6    mov r3, #0x33
 7    b loop
 8 
 9    add_fun:
10        stmfd sp!, {r0-r3, lr} @ 入棧 r0-r3 ,lr指向跳轉此處的嚇一跳指令,也就是跳轉到 , 第5行 
11        mov r0, #0x1
12        mov r1, #0x2
13        add r4, r0, r1
14        ldm sp!, {r0-r3, pc} @ 出棧,把 lr 的地址彈到 pc指針中執行
15    loop:
16        b loop

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM