一。 單個寄存器操作讀寫內存
內存訪問指令格式:<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