寻址方式有 9种

1.寄存器

2.立即数

3.寄存器位移

4.寄存器间接

5.基址

6.多寄存器

7.堆栈

8.块拷贝

9.相对

1.

MOV R1,R2

R1 = R2

2.

MOV R0,#0x123

R0 = 0x123

或者用伪指令

LDR R0,=#0x123

编译后优先使用

MOV R0,#0x123

如果无法使用,则使用LDR 指令根据PC+offset 加载内存中的数据的形式

      LDR R0,[PC,#offset]

      ...

PC+#offset : 0x123

3.

MOV R0,R2,LSL #3

R0 = R2 逻辑右移3位 后的值

寄存器位移有4类5种方式,位移指令不单独存在

类别-种类

格式 : Rx,位移助记符 <op1>

1.逻辑位移 LS

  1.左 LSL: 空隙用0填充

  2.右 LSR: 空隙用0填充

2.算数右移 ASR: 复制最高符号位

3.循环右移 ROR

4.带扩展的循环右移 RRX( 不带有 <op1> 操作数):最左侧高位空出的 用 C(进位状态寄存器) 填补,将最右侧移出的最低位 放到  C

4.

LDR R0,[R2]

5.

LDR R2,[R3, #0x10]

R2 = [R3 + 0x10] 地址中的数值

6.

LDMIA R1,{R2-R4,R6}

R2 = R1

R3 = [R1 + 0x04]

R4 = [R1 + 0x08]

R6 = [R1 + 0x0C]

7.

7-0.栈操作

1.入栈  STM  将数据写入内存

2.出栈  LDM  从内存读取数据

7-1.堆栈指针是否指向最后压入的数据项

1.是  满堆栈  入栈时先修改sp,再存入数据到栈顶  F

2.否  空堆栈  入栈时先存入数据到栈顶,再修改sp  E

7-2.堆栈指针的增长方向(入栈时)

1.向上(向高地址)    递增  A

2.向下(向低地址,X86)  递减  D

指令单词分解:

LDM F A

思考顺序(3个):  栈操作    sp指向满或空数据项      栈增长方向

可选取的值:              LDM 出栈    空  E          递增 A

          STM 入栈    满  F          递减 D

缩写:

LDM=STore Multiple data

STM=LoaD Multiple data

E=Empty

F=Full

A=Asc

D=Desc

根据上面2种分类的2种情况,做组合,可得出4种结果,再外加栈操作(入栈或出栈),一共8条指令(真想用一个3D的表格展示)

方式    出栈    入栈

满递增  LDMFA   STMFA

满递减  LDMFD     STMFD

空递增       LDMEA     STMEA

空递减  LDMED    STMED

例子:

STMFD R0!,R1

1.R0指向栈顶前一个数据项地址

2.[R0-0x4]                                       先修改sp指针 ,因为是满递减,所以先修改R0的值,指向新的栈顶空位,修改R0的值为 -0x4 因为是递减堆栈(增长堆栈时地址值减小)

3.[R0-0x4] = R1                               写入内存

4.R0 = R0+0x4                                ! 号表示 将指令对R0的修改后的值,最后写回到R0

但是在实践中,ARM32 的指令  出入栈都喜欢用块拷贝指令,而不用这里的栈操作指令

在ARM64 中 入栈用 STP 代替,出栈用 LDP 代替

STP 一次可以入2个数到栈中 (等效 STMEA , 入栈-空-递增) ,对应块拷贝指令为

LDP 一次可以出2个数到栈中 (等效 LDMED, 出栈-空-递减),对应块拷贝指令为 ??

8.

多寄存器传送指令用于将一块数据从存储器的一个位置拷贝到另一个位置

这类块拷贝寻址方式还是依赖于 STM,LDM 这一对 内存读写 指令之上

不同于前面堆栈的 F/E + A/D

这里换成了 I/D + A/B

8-0. 内存读写方式

1.读取内存  LDM

2.写入内存  STM

8-1. 指针增长方向

1.向上  对应堆栈的 递增 A(向高地址)  I      I=Incres     递增

2.向下  对应堆栈的 递减 D(向低地址)  D    D=Decres  递减

*对应堆栈操作指令的 A/D (例如 STMFD) = STMDA

8-2. 数据读写时机

1.指针修改后  对应堆栈操作的 满 F(先移动sp栈顶指针,再读写内存)  A    A=After   之后

2.指针修改钱  对应堆栈操作的 空 E(先读写内存,再移动sp栈顶指针)  B    B=Befor  之前

*对应堆栈操作指令的 F/E (例如 STMFD) = STMDA

所以 STM/LDM 组合到 I/D 和 F/E 也有8条指令

块拷贝指令的 思考顺序 的最后2位 助记符 和 堆栈的 是 相反的

指令单词分解:

LDM I B = LDM F A

思考顺序(3个):  内存操作  指针增长方向       数据操作时机  

可选取的值:       LDM 读   递增 I= (堆栈:递增 A)      指针修改后 A = (堆栈:满 F)

          STM 写   递减 D=(堆栈:递减 D)           指针修改前 B = (堆栈:空 E)

再实践中常常看到的汇编指令

出入栈用 XXXFD

入栈 STMFD (=STMDB,PUSH)

出栈 LDMFD  (=LDMIB,POP)

小结:指针指向栈顶,当栈内有数据时,指向栈顶的数据(非空)

push/pop 是 Thumb16/32,ARM32 下的指令

STM/LDM 是 ARM32 下的 32位长

STP,LDP 是 ARM64下常用指令32位长

就像 SVC = SWI ,是同一个指令(机器码一样(但Thumb,ARM32,ARM64 机器码不一样),只是对应多个助记符)

总结:

综合堆栈操作来说,总的要考虑3个因素,具体取值查上面的表(I/D A/B 之类的)

1.读/写 内存

2.先/后 修改指针,先/后 读写数据

3.指针修改方向 增/减 (向高地址/低地址)

堆栈操作和块拷贝有对应关系:

9.

相对于当前PC寄存器,提供一个立即数作为偏移值

比如

  。。。

  BEQ .LOOP

  。。。

.LOOP:

  MOV R0,#1

  。。。

BEQ LOOP指令 = PC = PC + offset .LOOP

参考:

https://www.cnblogs.com/fanzhidongyzby/p/5250116.html

https://www.eefocus.com/sunplusedu/blog/15-12/376231_f40ad.html

 

ARM 寻址方式的更多相关文章

  1. ARM寻址方式,王明学learn

    ARM寻址方式 所谓寻址方式就是处理器根据指令中给出的信息来找到指令所需操作数的方式. 一.立即数寻址 立即数寻址,是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数.这个操 ...

  2. 六、ARM 寻址方式

    寻址方式是针对源操作数来说的 6.1 立即数寻址 源操作数是立即数 立即数:操作码以 # 号开头的数字为立即数 立即数寻址: MOV   R0, #0x300 伪指令:        LDR   R0 ...

  3. 2.4 ARM寻址方式

    所谓的寻址方式就是处理器指令中给出的信息来找到指令所需要的操作数的方式 1. 立即数寻址 立即数寻址,是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为立即 ...

  4. ARM寻址方式

    寻址方式: 所谓寻址方式就是处理器根据指令中给出的信息来找到指令所需操作数的方式. 1.立即数寻址 2.寄存器寻址 3.寄存器间接寻址 就是寄存器中存放的是操作数在内存中的地址 例如以下指令: LDR ...

  5. [国嵌笔记][023][ARM寻址方式]

    寻找方式 1.处理器根据指令中给出的信息来找到指令所需操作数的方式 2.立即数寻址 操作数本身在指令中给出,立即数前加”#”表示立即数寻址,操作数在指令中 3.寄存器寻址 利用寄存器中的数值作为操作数 ...

  6. 【嵌入式开发】ARM 芯片简介 (ARM芯片类型 | ARM处理器工作模式 | ARM 寄存器 | ARM 寻址)

    : 12MHz 晶振 对应 405 ~ 532 MHz 处理速度; -- : 16K 指令缓存, 16K 数据缓存; -- : 32KB 指令缓存, 32KB 数据缓存; (3) 内存接口对比 : 提 ...

  7. ARM汇编语言

    ---恢复内容开始--- arm汇编语言 汇编语言是一种程序设计语言,arm处理器是一种16/32位的嵌入式RISC微处理器.一开始我把这混为一谈了.ARM汇编的特点:汇编语言,又叫助记符语言. 1) ...

  8. Arm寄存器介绍及汇编基础

    一.ARM处理器支持7种工作模式 ① 用户模式(USR): 用于正常执行程序(The normal ARM program execution state) ② 快速中断模式(FIQ): 用于高速数据 ...

  9. Ok6410裸机驱动学习(二)ARM基础知识

    1.ARM工作模式 ARM微处理器支持7种工作模式,分别为: l  用户模式(usr):ARM处理器正常的程序执行状态(Linux用户态程序) l  快速中断模式(fiq):用于高速数据传输或通道处理 ...

随机推荐

  1. hexdump 工具使用 和 .txt 文件的二进制查看

    最近使用txt文件进行数据处理的时候,突然发现txt文件是怎样编码数据的了,它是以二进制来进行存储的吗?为了知道这个情况,我使用hexdump工具进行查看txt文件的二进制形式,并顺道进行学习了hex ...

  2. Linux下磁盘实战操作命令

    企业真实场景由于硬盘常年大量读写,经常会出现坏盘,需要更换硬盘.或者由于磁盘空间不足,需添加新硬盘,新添加的硬盘需要经过格式化.分区才能被 Linux 系统所使用. 虚拟机 CentOS 7 Linu ...

  3. 【解决 FTP】windows访问Linux的vsftpd(FTP服务器)问题200 Switching to ASCII mode,227 Entering Passive Mode

    转载:关于FTP主动模式(active mode)与被动模式(passive mode)的工作原理: 主动模式(服务器向客户端敲门,然后客户端开门)FTP:客户机与服务器之间建立连接时,客户机是大于1 ...

  4. jira问题更改项目

    1.点击“问题”在问题中,筛选你要修改的问题,以下是以创建用户为搜索条件,然后点击“工具”---移动所有问题 2.选择要移动的问题,选择项目,进行移动

  5. 我的朋友&值得学习的大佬

    @media only screen and (max-width: 360px) { #friedsGroup { columns: 1 !important; } } #MySignature{ ...

  6. k8s发布文件记录

    1.环境变量配置项 apiVersion: v1 # api版本 kind: ConfigMap # 配置项 metadata: name: common-key-svc # 名字 namespace ...

  7. ZEN、ELECTRA、ALBERT

    一.ZEN 目前,大多数中文预训练模型基本上沿用了英文模型的做法,聚焦于小颗粒度文本单元(字)的输入.然而,与英文相比,中文没有空格等明确的词语边界.这个特点使得很多文本表达中存在的交叉歧义也被带入了 ...

  8. 数据结构与算法-Python/C(目录)

    第一篇 基本概念 01 什么是数据结构 02 什么是算法 03 应用实例-最大子列和问题 第二篇 线性结构 01 线性表及其实现 02 堆栈 03 队列 04 应用实例-多项式加法运算 05 小白专场 ...

  9. Java中的集合-您必须知道的13件事

    Java Collections Framework是Java编程语言的核心部分之一.集合几乎用于任何编程语言中.大多数编程语言都支持各种类型的集合,例如List, Set, Queue, Stack ...

  10. 6 种微服务 RPC 框架,你知道几个?

    开源 RPC 框架有哪些呢? 一类是跟某种特定语言平台绑定的,另一类是与语言无关即跨语言平台的. 跟语言平台绑定的开源 RPC 框架主要有下面几种. Dubbo:国内最早开源的 RPC 框架,由阿里巴 ...