日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

ARM 汇编 内存访问指令

發布時間:2023/12/15 综合教程 41 生活家
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的ARM 汇编 内存访问指令的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。