ARM的9种寻址方式

发布者:jingyan最新更新时间:2017-02-06 来源: eefocus关键字:ARM  寻址方式 手机看文章 扫描二维码
随时随地手机看文章

ARM的9种寻址方式

1)立即寻址

操作数是立即数,以“#”为前缀,表示 16 进制数值时以“0x”表示。

例:

MOV   R0,#0xFF00   ;0xFF00 ->  R0

SUBS   R0,R0,#1     ;R0 – 1 ->  R0

 

2)寄存器寻址

操作数的值在寄存器中,指令执行时直接取出寄存器值操作。

例:

MOV  R1,R2      ;R2 -> R1

SUB  R0,R1,R2    ;R1 - R2  ->  R0

 

3)寄存器偏移寻址

当第二操作数是寄存器偏移方式时,第二个寄存器操作数在与第一个操作数结合之前,选择进行移位操作。

例:

MOV  R0,R2,LSL #3     ;R2 的值左移 3 位,结果放入 R0,即 R0 = R2 * 8

ANDS  R1,R1,R2,LSL #3  ;R2 的值左移 3 位,然后和 R1 相与操作,结果放入 R1

 

可采用的移位操作:

LSL:逻辑左移(Logical Shift Left),低端空出位补 0

LSR:逻辑右移(Logical Shift Right),高端空出位补 0

ASR:算术右移(Arithmetic Shift Right),移位过程中符号位不变,即源操作数为正数,则高端空出位补 0,否则补 1

ROR:循环右移(Rotate Right),由低端移出位填入高端空出位

RRX:带扩展的循环右移(Rotate Right eXtended by 1 place),操作数右移一位,高端空出位用原 C 标志值填充。

 

4)寄存器间接寻址

操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。

例:

LDR   R1,[R2]   ;将 R2 中的数值作为地址,取出此地址中的数据保存在 R1 中

SWP  R1,R1,[R2] ;将R2中的数值作为地址,取出此地址中的数值与 R1 中的值**

 

5)基址寻址

将基址寄存器的值与偏移量相加,形成操作数的有效地址,基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能寄存器访问等。 

例:

LDR    R2,[R3,#0x0F] ;将R3中的数值加 0x0F 作为地址,取此地址的值保存在 R2 中

STR    R1,[R0,#-2] ;将R0中的数值减 2 作为地址,把 R1的值保存到此地址中

 

6)多寄存器寻址

一次传送多个寄存器值,允许一条指令传送 16 个寄存器的任何子集或所有寄存器。多寄存器寻址时,寄存器子集按由小到大的顺序排列,连续的寄存器可用“-”连接,否则,用“,”分隔书写。

例:

LDMIA   R1!,{R2-R7,R12} ;将 R1的值读出到 R2-R7,R12,过程中R1 自动加 1

STMIA   R0!,{R3-R6,R10};将 R3-R6,R10的值保存到 R0 指向的地址,过程中R0 自动加 1

 

7)堆栈寻址

堆栈寻址使用堆栈指针SP,即R13,指向堆栈的栈顶。堆栈可分为两种:

向上生长:向高地址方向生长,称为递增堆栈,

向下生长:向低地址方向生长,称为递减堆栈,

堆栈指针指向最后压入的有效数据项,称为满堆栈,

堆栈指针指向下一个要放入的空位置,称为空堆栈,这样就有 4 种类型的堆栈。

A)满递增:堆栈地址向上增长,堆栈指针指向有效数据的最高地址。如 LDMFA,STMFA。

B)空递增:堆栈地址向上增长,堆栈指针指向堆栈上的第一个空位置。如 LDMEA,STMEA 。

C)满递减:堆栈地址向下增长,堆栈指针指向有效数据项的最低地址。如 LDMFD,STMFD。

D)空递减:堆栈地址向下增长,堆栈指针指向堆栈下的第一个空位置。如 LDMED,STMED 。

例:

STMFD     SP!,{R1-R7,LR}  ; 将 R1~R7,LR 入栈。满递减堆栈。

LDMFD     SP!,{R1-R7,LR}  ;数据出栈,放入 R1~R7,LR 寄存器。满递减堆栈。

 

8)块拷贝寻址

用于将一块数据从存储器的某一位置拷贝到另一位置。

例:

STMIA  R0!,{R1-R7}  ;将R1~R7的数据保存到存储器中,存储器指针在保存第一个值之后增加,增长方向为向上增长。

STMIB  R0!,{R1-R7}  ;将R1~R7的数据保存到存储器中,存储器指针在保存第一个值之前增加,增长方向为向上增长。

STMDA  R0!,{R1-R7}  ;将R1~R7的数据保存到存储器中,存储器指针在保存第一个值之后增加,增长方向为向下增长。

STMDB  R0!,{R1-R7}  ;将R1~R7的数据保存到存储器中,存储器指针在保存第一个值之前增加,增长方向为向下增长。

 

9)相对寻址

相对寻址是基址寻址的一种变通,由程序计数器 PC 提供基准地址,指令中的地址

码字段作为偏移量,两者相加后得到有效地址。

例:

BL    ROUTE1    ;调用ROUTE1 子程序

BEQ   LOOP      ;条件跳转到 LOOP 标号处

LOOP  MOV R2,#2

ROUTE1


关键字:ARM  寻址方式 引用地址:ARM的9种寻址方式

上一篇:ARM汇编指令的速查表、特点和格式
下一篇:ARM的37个寄存器

推荐阅读最新更新时间:2024-03-16 15:32

基于ARM的非特定人语音识别系统电路设计
  非特定人语音识别技术研究的最终目的是让计算机等设备能够“听懂”人类语音,提取出语音中所包含的特定信息,成为人机通信和交互最便捷的手段。由于语音信号本身具有不确定性、动态性和连续性,这就为准确量化和处理该信号带来非常大的困难,每个人的语音要建立不同的语音样本也为识别的普及带来瓶颈约束。目前的语音识别是先建立特征库然后将待识别的信号经处理与特征库比对得到相似结果判定输出。从本质上属于基于统计模式的基本理论,分语言模型训练、识别分析两个大阶段构成和实现。   系统设计的整体结构   系统以STM32F103C8T6 微控制器为控制核心,搭配微控制器最小核心电路、LD3320语音识别电路、SD卡电路、电源电路、用户按键输入电路、串
[单片机]
基于<font color='red'>ARM</font>的非特定人语音识别系统电路设计
ARM嵌入式汽车节能控制系统
  引言   由于各种原因,公交车总是不断重复加速—减速或停车—再加速的过程。通过加装本节能装置,当汽车需要制动时,在主控单元的控制下,可将汽车行驶时具有的巨大动能通过空气压缩机转化成高压气体的势能并储存起来,从而实现汽车减速或停车。当汽车需要启动或加速时,用储存起来的高压气体势能代替燃油来驱动汽车,从而实现汽车能量的回收再利用,达到节能的效果。同时由于汽车在起动或加速时能耗最大,如果汽车是用燃油驱动,则此时油料燃烧不充分,燃烧效果最差,而且产生的噪音最大。   系统工作原理   本系统主要由三部分组成,即检测部分,控制部分和执行机构。检测部分包括踏板位置传感器、曲轴位置传感器、压缩机活塞位置传感器、汽车运行速度传感器、储气
[应用]
arm linux kernel 从入口到start_kernel 的代码分析
参考资料: 《ARM体系结构与编程》 《嵌入式Linux应用开发完全手册》 Linux_Memory_Address_Mapping http://www.chinaunix.net/old_jh/4/1021226.html 更多文档参见: http://pan.baidu.com/s/1mg3DbHQ 本文针对arm linux, 从kernel的第一条指令开始分析,一直分析到进入start_kernel()函数. 我们当前以linux-2.6.19内核版本作为范例来分析,本文中所有的代码,前面都会加上行号以便于和源码进行对照, 例: 在文件init/main.c中: 00478: asmlinkage
[单片机]
<font color='red'>arm</font> linux kernel 从入口到start_kernel 的代码分析
基于多核ARM的数控系统的设计
1 绪论 随着嵌入式技术的发展,嵌入式处理器 ARM 广泛应用于数控系统。ARM 是英国剑桥从事基于 RISC(Reduced Instruction SetComputer)技术芯片设计开发,作为知识产权供应商 ARM 公司设计的芯片。根据各自不同的应用需要,在芯片外适当添加外围电路,从而形成更具特色的 ARM 处理器。ARM 芯片具有RISC 体系的一般特点,如:具有大量的寄存器。绝大多数操作都在寄存器中进行,通过 Load/Store 的体系结构在内存和寄存器之间传递数据。寻址方式简单。采用固定长度的指令格式。目前的 ARM 内核有ARM7、ARM9、ARM9E、ARM10E、ARM11、SecurCore 等多种类型。
[单片机]
基于多核<font color='red'>ARM</font>的数控系统的设计
ARM的中断(S3C2440)
中断要发生需要三部分同时工作: 中断源 中断控制器 CPU使能中断 中断控制器的作用: 汇集各类中断信号并发给CPU。 中断处理过程: 1.中断控制器汇集各类中断信号并发给CPU。 2.CPU保存当前程序的运行环境(各个寄存器),调用中断服务程序ISR来处理中断 3.在ISR中通过读取中断控制器、外设相关寄存器来识别哪个中断,并处理。 4.清除中断:通过读写中断控制器和外设相关寄存器来实现。 5.最后恢复中断程序的运行环境(即2中保存的各个寄存器)。继续执行。 看一下中断控制器的内部结构框图,了解中断处理细节。 有些请求源是带sub寄存器的,有些则不带。 (1) 对于带sub寄存器的,中断源被触发之后,SUBSRC
[单片机]
<font color='red'>ARM</font>的中断(S3C2440)
arm-linux 学习(1)点亮第一个led程序
1.学习Gpio原理图 led与开发板的接线图, 总结: nled1—– GPF4 nled2—– GPF5 nled4—– GPF6 2. 寄存器 这里用到两个寄存器,一个是端口控制寄存器:GPACON-GPJCON,还有一个寄存器是端口数据寄存器GPADAT-GPJDAT 这里可以看出端口控制寄存器的地址是:0x56000000 端口数据寄存器的地址是:0x56000004 所以我们只需要配置这两个寄存器对应的LED位就可以实现控制led的亮或者灭。 第一步:首先配置LED引脚为输出模式 直接依次配置好:0001 0101 0000 0000==0x1500 第二步:对应位置输出低电平 需要设置
[单片机]
<font color='red'>arm</font>-linux 学习(1)点亮第一个led程序
关注 Arm DevSummit 2021 跟进EDA的技术热点
Arm DevSummit 2021科技盛会于10/19 (周三) – 10/21 (周五) 盛大举行,这个为期三天的虚拟会议提供对最新技术趋势的见解,汇集了来自 Arm 生态系统的世界上最雄心勃勃的软件和硬件工程师及科技爱好者,相聚云端,共话计算世界未来。 从移动通信到 5G、从物联网到人工智能,从嵌入式到超级计算,每一次创造未来的新技术,都激发了世界的潜力。30 多年来,拥有数百万硬件工程师和软件开发人员的 Arm 生态系统在几代计算中取得了共同的成功。2021 年 Arm DevSummit 盛会议程包括为期三天的主题演讲、86 场技术会议和 11 场研讨会,涵盖七大主题:1、适用于终端、边缘和云的云原生 2、软件定义的
[手机便携]
ARM嵌入式系统开发之发送过程的实现
要通过网卡发送数据时,上层协议实体调用函数hard_start_xmit(),在我们的驱动程序中这个函数被映射成DM9000_wait_to_send_packet()函数,正如它名字中wait所表示的那样,这个函数只完成了等待发送的工作,实际的发送是调用DM9000_hardware_send_packet()函数完成的,这也是前面提到的buffer分配机制的一种体现。 在具体介绍这两个函数之前,有必要简单说一说DM9000芯片发送数据的工作原理。前面已经讲过,为了增加网络吞吐量DM9000芯片内部集成了8K的buffer,芯片对这些buffer采用了内存页面管理方式,每页256B,内部寄存器支持简单的内存分配指令。对于内核
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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