ARM 汇编寻址方式

发布者:达文西happy最新更新时间:2020-01-12 来源: eefocus关键字: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-Linux移植之二
下一篇:ARMGNU伪指令

推荐阅读最新更新时间:2024-11-09 17:13

深度了解ARM架构基础知识
从单片机转到ARM,主要需要学习ARM的架构,ARM相比单片机多了一些外设和总线。在仅仅是裸奔的情况下,如果熟悉了ARM架构,那么我认为使用任何ARM架构的芯片和用单片机将没有区别。ARM架构之所以更复杂,当然是为了跑更快以及更好地支持片上系统,所以在某种程度上来说对片上系统不是很了解的话那对于ARM架构的理解也不会那么深。 通用寄存器 R13通常被用作栈指针,进入异常模式时,可以将需要使用的寄存器保存在R13所指的栈中;当退出异常吹程序时,将保存在R13所指的栈中的寄存器值弹出。 R14又被称为连接寄存器(LinkRegister,LR),即PC的返回值。 R15又被记作PC。ARM指令是字对齐的,PC的值的第0位和
[单片机]
深度了解<font color='red'>ARM</font>架构基础知识
采用ARM高分辨率压电陶瓷D/A电路设计
  根据压电陶瓷微位移器对驱动电源的需求,设计了压电驱动电源系统的方案。该方案先介绍了电源系统中的数字电路部分和模拟电路部分,并对驱动电源的精度与稳定性进行了分析与改进。最后对驱动电源的性能进行了实验验证。实验结果表明:该设计方案的电源输出电压噪声低于0.43 mV、输出最大非线性误差低于0.024%、分辨率可达1.44 mV,能够满足高分辨率微位移定位系统中静态定位控制的需求。   压电陶瓷驱动器(PZT)是微位移平台的核心,其主要原理是利用压电陶瓷的逆压电效应产生形变,从而驱动执行元件发生微位移。压电陶瓷驱动器具有分辨率高、响应频率快、推力大和体积小等优点,在航空航天、机器人、微机电系统、精密加工以及生物工程等领域中得到了
[单片机]
采用<font color='red'>ARM</font>高分辨率压电陶瓷D/A电路设计
基于ARM-Linux架构的远程可控电源插座设计方案
互联网的迅速发展,实现了信息的高速传输和资源共享,极大地方便了人们的生活。嵌入式系统广泛应用于各种电器产品、智能仪表和控制设备中,它与互联网的结合是一种必然的趋势。 嵌入式系统和网络技术的快速发展,为网络远程控制的发展和完善提供了技术基础。 笔者综合运用嵌入式系统和Web技术,设计了一种可通过互联网进行远程控制的电源插座系统,实现对家用或工业电器的远程实时控制。用户通过网页浏览器访问该系统,对各插座进行打开或关闭的操作,实现对与其相连接的电器的远程控制。 1 嵌入式Web工作原理 嵌入式Web的体系结构如图1所示。客户端和嵌入式系统中Web服务器之间的通信协议采用HTTP(超文本传输协议)。嵌入式操作系统提
[单片机]
基于<font color='red'>ARM</font>-Linux架构的远程可控电源插座设计方案
处理器架构 (九) ARM 及其他架构参考手册包括内容抽象
ARM 架构分为 多个版本,版本兼容问题. 包括内容what-do-we-mean-by-architecture ARM 内核架构 // XXX 内核架构 . 例如 VFP 编程模型 数据类型 处理器模式 寄存器 异常 大小端 非对齐访问 同步原语 指令集1 指令集2 更改PC 分支指令 寄存器- 寄存器 数据处理指令 内存 寄存器 装载和存储 通用寄存器 CPSR 状态寄存器传输指令 CP寄存器 协处理器指令 让CPU进入异常的指令,修改了很多寄存器. SWI 和 BKPT 寻址模式 内存架构 me
[单片机]
低功耗MCU,又卷起来了
从今年的MCU市场趋势来看,AI计算能力、蓝牙5.4、Wi-Fi 6/6E、GPU IP、新型存储器以及更先进的制程是MCU市场“内卷”的主要重点。但MCU作为“小而美”的产品,拼性能是一个路线,拼小巧精致也是一个路线。在MCU领域,低功耗MCU是很重要的细分市场。 所谓低功耗,并非粗暴地改用8位/16位的MCU产品,而是通过与通用处理器不同的设计方法和工艺选择,在保证能够实现需要的基本功能基础上,尽量压低功耗,以降低MCU能耗和漏电流。同时,搭配深度睡眠(Deep-sleep)、部分睡眠(Sleep)和待机(Standby)等不同低功耗电源模式以及时钟系统,实现效能和功耗平衡。过去,低功耗MCU产品多以Cortex-M0/0
[单片机]
低功耗MCU,又卷起来了
51单片机汇编语言实验(三)-----定时/计数器实验
一、实验目的:    学习定时/计数器的工作方式,掌握程序设计方法。 二、实验设备:    PC计算机一台,Dais-52PRO+实验系统一套。 三、实验内容:    1. 定时器实验    2. 计数器实验 四、 定时器实验    1、实验原理:    使用T0进行定时,编写程序,使P1.0控制的发光二极管L0每隔2秒交替点亮或熄灭。    2、实验步骤:   ① 将试验箱IO区的P1.0与LED区的L0按图下图连线;   ② 编写程序,经编译、链接无语法错误后装载到实验系统;   ③ 运行程序,观察发光二极管L0,应每隔2秒交替点亮或熄灭;   ④ 实验完毕后,应使用暂停命令中止程序的运行。    3、参考代码: //实验
[单片机]
51单片机<font color='red'>汇编</font>语言实验(三)-----定时/计数器实验
ARM核心板在溯源秤中的应用
 关于牛的身世,你忽略了什么?   “想要抓住TA的心,先要抓住TA的胃”。为了暗慕已久的TA,小E苦心研习多道秘制菜品,其中包括秘制酱牛肉。来到肉菜市场选料,小E有点懵,肉菜市场远不如大型连锁超市的敞亮,摊点上待售的肉品虽看不出异样,但怎样判别它们的加工日期?怎样追查它们的来源身世?   牛肉身世的追溯,需要依靠一套完整的肉菜溯源体系。一头牛从饲养到出栏,再到加工厂、进入零售终端,每一个流程的信息都会记录在一张溯源卡内,同时溯源卡还将记录这一批牛肉的数量。   在零售终端,则主要通过溯源秤来实现肉菜溯源。   溯源秤也叫追溯秤、网络秤、射频识别计价秤等,利用溯源秤作为销售终端机,实现食品信息录入、传递、记录食
[单片机]
<font color='red'>ARM</font>核心板在溯源秤中的应用
ARM中的链接地址(为什么ARM要重定位)
在考虑为什么要重定位的问题之前,我们首先要明白一下几点: 1. 链接地址的定义:我自己理解是,程序被定义的开始执行的内存地址。 2. 当ARM从nandflash启动的时候,CPU所做的工作是将nandflash中的前8K代码自动的复制到6410的0地址(即Stepping Stone)中去,然后从0地址开始执行程序。 3. 程序在执行过程中,用链接地址来访问全局变量。全局变量一般被存放于程序的最后面。 在程序超过8K时,如果不进行重定位,就会发生类似于下面的访问错误,这将导致程序无法正常执行。 假设我们定义程序的链接地址为0x50000000,程序从6410的0地址(即Stepping
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved