[原创]【ARM】LDR STR指令的N种寻址姿势(上)

爱吃菠菜 2017-10-3 10:54 834

〇 、前言

    指令集版本:arm v5te 32bit


    LDR&STR指令分为两大类,

    一种是操作32bit字数据 或 8bit无符号字节数据的,

    另一种是操作16bit半字数据 或  8bit有符号字节数据的。

    这里先只讲第一类,LDR LDRB这种。(LDR   R0, [R1, # 4]    ;    LDRB R0, [R1, # 4]

---------------------------------------------------------------------------------------------------------------------------


一、概念(看不懂不要紧,可以分析实例后再回头看概念对号入座)

    1 指令格式:

    LDR {cond} {B} {T} <Rd>,{address_mode}

    LDR {条件码} {字/无符号字节} {是否有 ! } <目标寄存器>,{内存地址}


    2 指令的 address_mode由两部分组成

     基址  土  偏移

     (1)基址就是寄存器Rn

     (2)这个偏移则有多种形式,下面就单独拿出来说。(直接是立即数、或者存在一个寄存器里、或者寄存器再配合一个移位操作计算出来的)


    3 地址偏移量分为三种形式

    (1)立即数

             LDR R0, [R1, #4]


    (2)寄存器

             LDR R0, [R1, R2]


    (3)寄存器及移位常数

             LDR R0, [R1, R2, LSL #2]


     另外:地址偏移量形式相同的指令,其机器码数据结构也相同。


    4 最后,还要考虑个地址计算方法的事,分三种方法

    (1)偏移量方法

             LDR R0, [R1, #4]


    (2)事先更新方法(事先:先计算偏移,访问内存,最后更新基址寄存器)

             LDR R0, [R1, # 4] !


    (3)事后更新方法(事后:先访问内存,然后计算新基址寄存器)

             LDR R0, [R1], # 4

---------------------------------------------------------------------------------------------------------------------------



二、实例分析:

1 指令的9种格式:


2 用伪代码解释指令的执行过程:


3 关于立即数和移位位数的取值范围


4 表格中同一横排的地址偏移量形式相同,机器码数据结构相同。


5 表格中同一竖排的计算方法相同。

---------------------------------------------------------------------------------------------------------------------------


三、指令机器码的数据结构

1 地址偏移量类型:立即数



2 地址偏移量类型:寄存器



3 地址偏移量类型:寄存器移位常量



4 各bit位的含义:



---------------------------------------------------------------------------------------------------------------------------

若有错误希望能指出,共同学习进步~


最新回复 (4)
Editor 2017-10-3 11:55
2
这位同学,过节还继续学习,并且与他人分享,以后必成大事!
爱吃菠菜 2017-10-3 12:26
3
Editor 这位同学,过节还继续学习,并且与他人分享,以后必成大事![em_13]
  放假没别的事、闲不住
聖blue 2017-10-6 20:24
4
不错!!!!!!
华仔在吗 2017-10-10 10:16
5
干货啊,支持一下
返回