ARM寄存器的8种寻址方式01
一、立即数寻址
操作数由指令本身给出
MOV r0,#0x0F //是所有寻址方式里面速度最快的,但是受到合法立即数的限制
立即数要求以#和$开头
十六进制,#后跟0x;十进制,#后直接加;八进制,#后跟0;二进制,#后跟0b
什么是合法立即数?ARM中要求立即数是一个8位的常数循环左移偶数位得到的数值。也就是说只要是在0x00~0xFF中的一个数,或者是在这个区间中的一个数循环左移偶数位的数值,都是合法立即数。
给大家一个快速判断方法:
1、如果该数在0x00~0xFF之间,它是一个合法立即数;
2、如果该数>0xFF,先把它换算成十进制数,如果能被4整除,它就是一个合法立即数,否则是一个非法立即数。
二、寄存器寻址
利用寄存器中的数值作为操作数进行操作
ADD r0,r1,r2
MOV r0,r1
是速度仅次于立即数寻址的操作。
三、寄存器移位寻址
操作数由寄存器中的数值移位得到,移位的方式由助记符的形式给出,移位数可以是一个立即数也可以是一个寄存器数值
MOV r1,#7
MOV r2,#1
MOV r0,r1,r2,LSL #2
四、寄存器间接寻址
把寄存器中的值当做是被操作的数值在存储器中的地址,操作数本身放在寄存器中。
LDR r0,[r1]
STR r0,[r1]
实验验证:
执行第一条指令(MOV r1,0x35000)后寄存器的状态值
当前内存状态
执行第二条指令(LDR r0,[r1])后寄存器状态
可以看到r0寄存器的值已经变成上面内存地址为0x35000处内存的内容了。由于内存中数据的存储是有大小端问题的,所以看上去不一样实际是一样的值。
此时寄存器状态
r0保存着地址为0x35000的存储器中的数值,r1立即数赋值0x35000,r2立即数赋值0x34000。
此时内存状态
STR r0,[r2]指令执行完之后,0x34000处状态
该处值已经修改为寄存器r0的值。
LDR和STR指令说明:
LDR 目的寄存器,【存储器地址】
用于从存储器地址处获取一个32位的数据送至目的寄存器,当程序计数器PC被当做目的寄存器时,存储器中取到的数据被当做跳转的目的地址来使用,从而实现程序的跳转。
STR 源寄存器,【存储器地址】
用于将源寄存器中的数据送入存储器地址处。
最新文章
- 【转】【MySQL】mysql 通过bin-log恢复数据方法详解
- td:first-child 伪类 匹配第一个 匹配第一个 <;td>; 元素
- tmux常用命令
- 下载pdf_不同操作系统,无法正常下载(兼容性问题)
- NDK(22)JNI编程如何避免常见缺陷
- Git快速上手 : Tortoise工具使用
- 五指CMS v1.2 GBK 发布下载
- iOS监听电话事件
- zoj 2734 Exchange Cards【dfs+剪枝】
- The Euler function(欧拉函数)
- Linux 抓包命令
- Eclipse安装Git插件以及通过Git导入华为软件开发云项目
- js中常见的一些兼容性问题
- python-scrapy的编码问题
- Jquery实现点击表格行变色!
- 华为MAC Flapping , MAC的漂移
- webpack应用案例之美团app
- Django 前台通过json 取出后台数据
- 微软Power BI 每月功能更新系列——10月Power BI 新功能学习
- mysql where in形式存储过程如何传递带有单引号的入参
热门文章
- shell 编程中使用到得if语句内判断参数
- 第十二天--Property List和NSUserDefaults
- fir.im Weekly - 2016 移动开发技术大回顾
- 关于解决 The processing instruction target matching ";[xX][mM][lL]"; is not allowed
- LeetCode22 Generate Parentheses
- hadoop2 作业执行过程之作业提交
- 关于yarn的spark配置属性
- 100%会用到的angularjs的知识点【新手可mark】
- Linux常用命令速查备忘
- IOS NS 字符串 数组 字典 文件 动态 静态 操作