ARM 寻址方式
寻址方式有 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 寻址方式的更多相关文章
- ARM寻址方式,王明学learn
ARM寻址方式 所谓寻址方式就是处理器根据指令中给出的信息来找到指令所需操作数的方式. 一.立即数寻址 立即数寻址,是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数.这个操 ...
- 六、ARM 寻址方式
寻址方式是针对源操作数来说的 6.1 立即数寻址 源操作数是立即数 立即数:操作码以 # 号开头的数字为立即数 立即数寻址: MOV R0, #0x300 伪指令: LDR R0 ...
- 2.4 ARM寻址方式
所谓的寻址方式就是处理器指令中给出的信息来找到指令所需要的操作数的方式 1. 立即数寻址 立即数寻址,是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为立即 ...
- ARM寻址方式
寻址方式: 所谓寻址方式就是处理器根据指令中给出的信息来找到指令所需操作数的方式. 1.立即数寻址 2.寄存器寻址 3.寄存器间接寻址 就是寄存器中存放的是操作数在内存中的地址 例如以下指令: LDR ...
- [国嵌笔记][023][ARM寻址方式]
寻找方式 1.处理器根据指令中给出的信息来找到指令所需操作数的方式 2.立即数寻址 操作数本身在指令中给出,立即数前加”#”表示立即数寻址,操作数在指令中 3.寄存器寻址 利用寄存器中的数值作为操作数 ...
- 【嵌入式开发】ARM 芯片简介 (ARM芯片类型 | ARM处理器工作模式 | ARM 寄存器 | ARM 寻址)
: 12MHz 晶振 对应 405 ~ 532 MHz 处理速度; -- : 16K 指令缓存, 16K 数据缓存; -- : 32KB 指令缓存, 32KB 数据缓存; (3) 内存接口对比 : 提 ...
- ARM汇编语言
---恢复内容开始--- arm汇编语言 汇编语言是一种程序设计语言,arm处理器是一种16/32位的嵌入式RISC微处理器.一开始我把这混为一谈了.ARM汇编的特点:汇编语言,又叫助记符语言. 1) ...
- Arm寄存器介绍及汇编基础
一.ARM处理器支持7种工作模式 ① 用户模式(USR): 用于正常执行程序(The normal ARM program execution state) ② 快速中断模式(FIQ): 用于高速数据 ...
- Ok6410裸机驱动学习(二)ARM基础知识
1.ARM工作模式 ARM微处理器支持7种工作模式,分别为: l 用户模式(usr):ARM处理器正常的程序执行状态(Linux用户态程序) l 快速中断模式(fiq):用于高速数据传输或通道处理 ...
随机推荐
- centos python3 的 卸载 删除
卸载/删除python 3.4看到网上说慎用 apt-get remove和 yum remove ,因此不敢用此类命令用卸载了(以后阿里云服务器快过期不用了的时候可以试一下,看看系统是否会崩,哈哈) ...
- alluxio 安装记录及相关信息
最近要尝试探究一下alluxio相关的知识,本博客进行对alluxio的安装过程进行备忘: 单例安装过程: https://docs.alluxio.io/os/user/stable/cn/cont ...
- Docker 镜像介绍和命令
目录 是什么 UnionFS(联合文件系统) Docker镜像加载原理 分层的镜像 为什么 Docker 镜像要采用这种分层结构呢 特点 Docker镜像commit操作补充 案例演示 1.从Hub上 ...
- Shadow Map -- 点阴影(全方位)
昨晚终于把点阴影(深度CubeMap)程序调通了,思想不难,基本就是在上节定向光阴影基础上稍作修改,但是CG程序不太方便Debug,需要输出中间效果图进行判断,耽搁了一会儿. 过程如下: 1.将深度渲 ...
- JUC-4-CopyOnWriteArrayList
什么是CopyOnWrite容器 CopyOnWrite容器即写时复制的容器.通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新 ...
- AcWing 28. 在O(1)时间删除链表结点
地址 https://www.acwing.com/problem/content/description/85/ 题目描述给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点. 假设链表 ...
- 新终端必须source /etc/profile的解决办法,同时解决变色问题
Linux环境变量文件 /etc/profile:在登录时,操作系 统定制用户环境时使用的第一个文件 ,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. /etc /enviro ...
- intellij idea从git检出代码并建立工程
1. 打开intellij idea,点击configure,settings 2. 左侧展开Version Control,点击Git,点击下图中红框中按钮 3. 在弹出窗口中找到git.exe,点 ...
- linux常用命令指南——查找文件我最强:find
2.3.2 查找文件我最强:find 2.3.2.1 find查找常用命令示例 find / -name 'wfy.txt' # 从根目录下开始查找文件wfy.txt find . -name '*f ...
- 纠错:Feign 没用 短连接
Feign 默认不是 短连接 疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 疯狂创客圈(笔者尼恩创建的高并发研习社群)Springcloud 高并发系列文章,将为大 ...