ARM 汇编寻址方式
ARM支持9种寻址方式:立即数寻址,寄存器寻址,寄存器偏移寻址,寄存器间接寻址,基址变址寻址,多寄存器寻址,相对寻址,堆栈寻址,块拷贝寻址。
立即数寻址
将数据直接存放的指令中发给CPU,首先由于ARM的一条指令占了32bit,而操作码本身也要占据一些位,所以留给立即数的位数肯定不到32bit,其次并不是满足指定位数的数字都是立即数,ARM中的立即数必须可以通过某个8bit的数据经过循环右移得到
MOV R0,#255 ;R0 <- #255,#0~#255都是立即数
ADD R0, R0, #1 ;R0 <- (R0+#1)
寄存器直接寻址
将寄存器中的数据用作操作数
MOV R0, R1 ;R0 <- R1
ADD R0,R1, R2 ;R0 <- (R1 + R2)
寄存器间接寻址
将寄存器中的数据作为主存中操作数的地址,去到相应的主存地址取得操作数,用[R0]
表示将R0
中的数据当作操作数的地址...,[R0]!
表示将R0
中的数据当作操作数的地址并将操作后的结果地址给R0
LDR R0,[R1] ;将R1指向的数据加载到R0中
STR R0, [R1]! ;将R0存储的数据加载到R1指向的主存地址中,加载完毕R1中为操作后的地址
ADD R0,R1,[R2]
寄存器偏移寻址
现将寄存器的值进行移位,再将移位后的数据当作操作数
MOV R0,R2,LSL #1 ;R2的值左移1位,结果赋给R0。
MOV R0,R2,LSL R1 ;R2的值左移R1位,结果放入R0。
有6种移位操作:
LSL:逻辑左移(Logical Shift Left),寄存器中字的低端空出的位补0。
LSR:逻辑右移(Logical Shift Right),寄存器中字的高端空出的位补0。
ASL:算术左移(Arithmetic Shift Left),和逻辑左移LSL相同。
ASR:算术右移(Arithmetic Shift Right),移位过程中符号位不变,即如果源操作数是正数,则字的高端空出的位补0,否则补1。
ROR:循环右移(Rotate Right),由字的低端移出的位填入字的高端空出的位。
RRX:带扩展的循环右移(Rotate Right eXtended),操作数右移一位,高端空出的位用进位标志C的值来填充,低端移出的位填入进位标志位。
寄存器基址变址寻址
可以看作寄存器间接寻址的增强版,不再直接从寄存器指向的地址中取操作数,而是从寄存器指向的地址再偏移一个量之后再取操作数
LDR R0,[R1,#4] ;取R1的内容当作主存的地址,在此基础上+4byte,从该地址处取操作数。
LDR R0,[R1,#4]! ;同上,操作完毕后,!表示指令执行完毕把最后的数据地址写到R1,即R1原来的地址+4
LDR R0,[R1,R2] ;将寄存器R1的内容加上寄存器R2的内容形成操作数的地址,取得的操作数存入寄存器R0中。
STR R0, [R1,#-4];将R1中的数值减4作为地址,把R0中的数据存放到这个地址中。
LDR R0,[R1],#4 ;把R1指向的数据放到R0中,操作完成后[R1]自增4byte
批量寄存器寻址
LDMIA R0,{R1,R2,R3,R4} ;将R1,R2,R3,R4中的数据依次放入R0指向的内存地址,R0+4指向的内存地址...
LDMIA R0,{R1-R4} ;同上。
相对寻址
通过使用语句的中的标号进行寻址,通常配合跳转指令使用
BL FCN ;相对寻址,跳转到NEXT处执行。
...
FCN:
...
堆栈寻址
堆栈即Stack,因为CPU的寄存器总是及其有限的,很多时候我们不得不使用内存来存储数据,比如进行多级跳转的时候,这时候堆栈就是一个很好的工具,每次跳转就将当前函数的返回地址存储到内存,最底层被调用的子函数会最先返回,就先将压入栈的现场返回,以此类推...,ARM使用SP(R13)作为栈指针,ARM设计的内存栈模型有2×2=4种
按照栈在内存增长的方向分为递增栈和递减栈:
递增(Increase)堆栈:向堆栈写入数据时,堆栈由低地址向高地址生长。
递减(Descend)堆栈:向堆栈写入数据时,堆栈由高地址向低地址生长。
根据堆栈指针SP指向的位置,又可以把堆栈分为满堆栈和空堆栈两种。
满堆栈(Full Stack):SP始终指向栈顶元素,压栈的时候先移动SP,再将数据放入SP指向的地址。
空堆栈(Empty Stack):SP始终指向下一个将要放入元素的位置,压栈时先将数据放入SP指向的地址,再移动SP
最后,可以得到4种基本的堆栈类型:
满增栈(FA):堆栈指针指向最后压入的数据,且由低地址向高地址生长。
满减栈(FD):堆栈指针指向最后压入的数据,且由高地址向低地址生长。常用这种
空增栈(EA):堆栈指针指向下一个将要压入数据的地址,且由低地址向高地址生长。
空减栈(ED):堆栈指针指向下一个将要压入数据的地址,且由高地址向低地址生长。
STMFD SP!,{R1-R7, LR} ;将R1-R7和LR的数据按照压入FD栈
LDMFD SP!,{R1-R7, PC} ;从FD栈中取得数据依次放入R1-R7,PC
块拷贝寻址
块拷贝寻址提供了一块内存和一组寄存器之间的拷贝,按照内存使用方式的不同,可以分为2×2=4种。地址增方向/地址减方向×先偏移/后偏移。堆栈寻址就可以看作是块拷贝寻址的的一个实例。
即:
IB:Increment Before Operating
IA:Increment After Operating
DB:Decrement Before Operating
DA:Decrement After Operating
STMIA R0!,{R1—R7} ;将R1-R7的寄存器中的值放入R0指向的地址,R0自动更新,指向操作后的地址
ARM 汇编寻址方式的更多相关文章
- ARM汇编
ARM汇编 ISA ISA即指指令集架构(Instruction Set Architecture)是与程序设计有关的计算机架构的一部分,包括本地数据类型.指令.寄存器.地址模式.内存架构.中断和意外 ...
- 常用ARM汇编指令
常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区 作者:xuyuanfan77 [字体:大 中 小] 在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...
- ARM 汇编指令
ARM汇编程序特点: l 所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理,都是要传送到通 ...
- 经常使用ARM汇编指令
一面学习,一面总结,一面记录. 以下是整理在网上找到的一些资料,简单整理记录一下,方便以后查阅. ARM处理器的指令集能够分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.载入/存储指令. ...
- ARM汇编指令的一些总结-转
ARM汇编指令的一些总结ARM汇编指令很多,但是真正常用的不是很多,而且需要认真琢磨的又更少了.比较有用的是MOV B BL LDR STR还是通过具体汇编代码来学习吧.@ disable watch ...
- ARM汇编指令集_学习笔记(1)
一.什么是ARM汇编? 运行在ARM处理器上的汇编语言就叫ARM汇编. C程序运行在X86平台,底层就是X86汇编:运行在ARM平台,底层就是ARM汇编.ARM汇编与X86汇编有显著区别. X86属于 ...
- ARM 汇编的mov操作立即数的疑问
1. 因为对arm汇编有些指令还不能理解,特别是一些相似功能指令间的区别.偶然在网上搜到"faq ARM assembly",其中描述的几个问题还是值得好好研究一下. 2. 慢慢的 ...
- ARM汇编指令集1
(汇编)指令是CPU机器指令的助记符,经过编译过会得到一串0011组成的机器码,可以由CPU读取执行. (汇编)伪指令本质不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译 ...
- 12 ARM汇编
Android系统采用java作为平台软件基础开发语言,NDK使Android平台可以运行C/C++代码这些代码汇编成ARM的elf可执行文件. 原生程序生成过程 经历4步:1.预处理2.编译3.汇编 ...
随机推荐
- (学习笔记)PHP的输出echo和print
echo 和 print 之间的差异: echo - 能够输出一个以上的字符串 print - 只能输出一个字符串,并始终返回 1 echo语句 echo 或 echo()均可. 输出换行 echo ...
- PHP内核探索之变量(7)- 不平凡的字符串
切,一个字符串有什么好研究的. 别这么说,看过<平凡的世界>么,平凡的字符串也可以有不平凡的故事.试看: (1) 在C语言中,strlen计算字符串的时间复杂度是?PHP中呢? ...
- 解决MVC4发布在IIS7后,路径无法访问.apk文件的解决方法
随着智能手机的普及,越来越多的人使用手机上网,很多网站也应手机上网的需要推出了网站客户端,.apk文件就是安卓(Android)的应用程序后缀名,默认情况下,使用IIS作为Web服务器的无法下载此文件 ...
- Elastislide - 响应式的图片循环展示效果
Elastislide 是一款非常优秀的响应式 jQuery 图片循环展示(旋转木马)插件,集成了 Touchwipe 插件以支持触屏设备.提供了四种效果:水平图片传送带.垂直图片传送带.固定在屏幕底 ...
- ScrollReveal.js – 帮助你实现超炫的元素运动效果
ScrollReveal.js 用于创建和管理元素进入可视区域时的动画效果,帮助你的网站增加吸引力.只需要给元素增加 data-scrollreveal 属性,当元素进入可视区域的时候会自动被触发设置 ...
- 自己动手打造WEB服务器 Windows + Apache + PHP + MySQL
XWAMP并不打算打造一个多功能,零配置,方便调试的工具.XWAMP只是把原程序简单的组合在一起,利用CMD命令控制,真正的绿色版,只为了多学习点Windows + Apache + PHP + My ...
- iOS从info.plist获取项目的名称及版本号
NSString *executableFile = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString *)kCFBundl ...
- LBS上传到百度地图
准备: 第一步:注册百度地图开发者账号 第二步:使用开发者账号注册相对应秘钥 在LBS后台添加所需要上传的字段 1,添加WebClientHelper帮助类 2,LBS帮助类 private stri ...
- 【代码笔记】iOS-底下滚动,上面标题栏也会跟着变动
一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> #import "SVSegmentedCont ...
- Swfit 字符与字符串
Swfit 字符与字符串 OC 定义字符 char charValue = 'a'; Swift 定义字符 var charValue:Character = "a" Unicod ...