ARM基础学习-寄存器寻址方式和指令

发布者:omicron25最新更新时间:2021-11-26 来源: eefocus关键字:ARM  寄存器  寻址方式  指令 手机看文章 扫描二维码
随时随地手机看文章

寻址方式


数据都存在存储器中,寻址简单地说就是找到存储数据或指令的地址。存储器有很多存储单元,用于存储数据。或者说,寻址就是读取数据所在储存装置中对应地址编号中存储的内容;寻址方式是指某一个CPU指令系统中规定的寻找操作数所在地址的方式,或者说通过什么的方式找到操作数。寻址方式的方便与快捷是衡量CPU性能的一个重要方面.


1.立即数寻址:

操作数在指令中,如: ADD R0,R0,#10 —->R0 = R0 + 10


2.寄存器寻址:

利用寄存器中的值作为操作数,如:ADD R0,R1,R2 —->R0 = R 1 + R 2


3.寄存器移位寻址:

寄存器中的值移位后得到操作数,用到桶形移位器

介绍一下桶形移位器:

LSL:(逻辑左移),相当于无符号数x2;

ASR: (算术右移),相当于带符号的数除2;

LSR: (逻辑右移),相当于无符号数除2;

ROR:(循环右移),相当于位轮换;

RRX:(带扩展的循环右移),位轮换,从CF到MSB都参与;

如:ADD R0,R1,R2,LSL #2 ——–>R0 = R1 + R2<<2;


4.寄存器间接寻址:

寄存器中的值作为操作数的地址,操作数本身放在存储器中;

如:LDR R0,【R1】 —->R0 = 【R1】,取出R1存的地址中的值,赋给R0;


5.基址变址寻址:

基址寄存器的内容与指令中的偏移量相加,得到有效操作数的地址,然后访问该地址空间;

分三种:

1)、前索引:

如:LDR R0,【R1,#4】 —>R1存的地址+4,访问新地址里面的值,放到R0;

2)、自动索引:

如:LDR R0, 【R1,#4】! —>在前索引的基础上,新地址回写进R1;注:!表示回写地址:R1的存储地址在原来基础上加4;

3)、后索引:

如:LDR R0 【R1】,#4 —>R1存的地址的内容写进R0,R1存的地址+4再写进R1;


6.多寄存器寻址:

一条指令完成多个寄存器的传送,最多16个寄存器;

如:STMxx R0!,{R1-R5}

注:xx是IDAB的任意组合:I-增;D-减;A-后;B-先;

执行这类指令要考虑如下几个问题:

1)、基址寄存器指向原始地址有没有放一个有效值?

2)、寄存器列表哪个寄存器被最先传送?

3)、存储器地址增长方向?

4)、指令执行完成后,基址寄存器有没有指向一个有效值?

如:STMIA R0!,{R1-R5} 的答案分别是:有;R1;低-高;没有。

为什么要考虑这么多,因为涉及到数据还原的问题;

如:STMIB r0!,[r1-r5]

LDMDA r0! , [r1-r5] ——还原


LDMIA R1! ,{R2-R4,R6}

将R1和R1之后寄存器中的值读出保存到R2-R4,和R6中。其中R1每次自加一。

这里写图片描述

7.相对寻址:

pc当前值位基址,指令中值为偏移量,相加作为操作数的地址;

如 B/BL 不过有范围限制 pc+-32Mbytes


ARM指令


arm 指令的分类:跳转指令,数据处理指令,程序状态寄存器传输指令,Load/Store指令,协处理指令,异常中断产生指令;


1.跳转指令


B 跳转指令

BL 带返回的跳转指令,将PC寄存器的值保存到LR中

BLX 带返回和状态切换的跳转指令

BX 带状态切换的跳转指令


子程序当中如何实现还回 方式:


BX LR

MOV PC,LR

当子程序入口使用STMFD R13!,{register,R14},可以用LDMFD R13!,{register,PC}

也可用push {RX, lr} 然后pop {RX, pc}

BX:


BX指令跳转到指令中所指定的目标地址,若目标地址的bit[0]为0,则跳转时自动将CPSR中的标志位T复位,即把目标地址的代码解释为ARM代码;若目标地址的bit[0]为1,则跳转时自动将CPSR中的标志位T置位,即把目标地址的代码解释为Thumb代码。


2.数据处理指令


数据处理指令大致可分为3类:

1、数据传送指令;

2、算术逻辑运算指令;

3、比较指令。


算数处理指令用法这里可以字节参考书籍;


3.状态寄存器访问指令


在ARM处理器中,只有MRS指令可以对状态寄存器CPSR和SPSR进行读操作。通过读CPSR可以了解当前处理器的工作状态。读SPSR寄存器可了解到进异常前的处理器状态


应用示例:


MRS R1 CPSR ; 将CPSR状态,寄存器读取保存到R1中  

MRS R2,SPSR ; 将SPSR 状态寄存器读取保存到R2中  


用的地方:当异常中断嵌套的时候,需要在进入异常中断之后,嵌套中断发生之前保存当前处理器模式对应的SPSR,当进程切换的时候也需要保存当前状态寄存器值;


4.内存访问指令

一类用于操作32位的字节类型数据以及8位无符号的字节类型数据,另一类用于操作16位半字节类型数据以及8位的有符号的直接类型的数据;


LDR 字数据读取指令:将一个32位的字读取到指令中的目标寄存器当中;

例:LDR R0,【R1,#4】;将内存单元R1+4中的字读取到R0寄存器中;


LDRB 字节数据读取指令:将一个8位的字节数据读取到指令中的目标寄存器当中;高24位补0;

例:LDRB R0,【R1】


LDRBT 用户模式的字节数据读取指令,与LDRB一样操作,当特权模式下使用本指令时,内存系统将该操作当作一般用户模式下的内存访问操作;异常中断程序时在特权级的处理模式下执行的,这时如果需要按照用户模式的权限访问内存可以使用LDRBT;


LDRH 从内存中将一个16位的半字节数据读取到指令中的目标寄存器当中,高16位清0;


LDRSB 有符号的字节数据读取指令;


LDRSH 有符号的半字数据读取指令;


LDRT 用户模式的字数据读取指令;


STR 字数据写入指令;

例子:STR R0,【R1,0X100】;将R0中的字数据保存到内存单元R1 + 0x100中去;


STRB,STRH,STRBT就参考LDR;


5.批处理Load/Store内存访问指令


Load/Store单字型和无符号字节型数据:

Load指令把内存中的单个数据读取出来并写到某个通用寄存器中;

Store指令把单个寄存器中的数据读取出来并写到某个内存地址处;


Load/Store半字型、双字型和有符号字节型数据:

Load指令把内存中的单个数据读取出来并写到某个通用寄存器或一对通用寄存器中(pair);

Store指令把单个通用寄存器或某对通用寄存器中(pair)的数据读取出来并写到某个内存地址处;


LDM(1) 批量内存字数据读取指令;

LDM(2) 用户模式的批量内存字数据读取指令;理解对应LDRBT;

LDM(3)带状态寄存器的批量内存字数据读取指令,它同时将当前处理器模式对应的SPSR寄存器内容复制到CPSR寄存器中;


STM(1) 批量内存字数据写入指令;

STM(2) 用户模式的批量内存字数局写入指令;


Load/Store多个寄存器:

Load Multiple(LDM)指令可以一次性地把内存中的一个数据块装载到任意数量的通用寄存器中;

Store Multiple(STM)指令可以把任意数量的通用寄存器中的内容一次性地存储到一个内存块中;

Load/Store多个寄存器的指令分为两类:块拷贝指令和栈操作指令;


例如:


STMFD R13!, {R0-R12, LR}

LDMFD R13!, {R0-R12, PC}

LDMIA R0, {R5-R8}

STMDA R0, {R1, R3, R5-R7, R9}


6.信号量操作指令


信号量用于进程间的同步和互斥;,一条指令当中完成信号量的读取和修改操作;SWP 指令用于将一个内存字单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元中


SWP Rd,Rm,Rn


SWP R1,R2,[R3]:将内存当中R3中字节数据读取到R1寄存器当中,同时将R2寄存器的数据写入到内存R3单元中;

SWP R1,R1,[R2]:R1寄存器的值和内存单元R2的内容互换;


7.异常中断产生指令


ARM有两条异常中断产生的指令:软中断指令SWI用于产生SWI异常中断,ARM正是通过这种机制实现用户模式对操作系统中特权模式的程序的调用;断点中断指令BKPT。主要用于产生软件断点,供调试程序使用;


8.协处理器指令


协处理器(coprocessor)是一种芯片,用于减轻系统微处理器的某种处理任务。例如,数学协处理器可以控制数字处理;图形协处理器可以处理视频绘制。ARM支持16个协处理器,用于各种协处理器操作,例如协处理器15(CP15),ARM处理器使用CP15的寄存器来控制cache和存储器管理。


CDP:数据操作指令,通常用于初始化协处理器。

LDC:数据加载指令,用于将存储器中的数据传送到协处理器寄存器中。

STC:数据存储器指令,用于将协处理器寄存器中的数据传送到存储器中。

MCR:ARM处理器寄存器到协寄存器寄存器的数据传送指令。

MRC:协处理器寄存器到ARM处理器寄存器的数据传送指令。


如CP15是ARM协处理器中十分重要的一个,MCR指令将ARM处理器的寄存器中的数据传送到协处理器的CP15寄存器中。如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断。


程序示例


1.简单的串比较strcmp


strcmp:

    LDRB R2,[R0],#1;//取出r0的数据放到R2中,r0地址加1;

    LDRB R3,[R1],#1;

    CMP R2,#0;//判断第一个字串是否搜索完毕;

    CMPNE R3,#0;//判断第二个字串是否搜索完毕;

    BEQ return;//if 1

    CMP R2,R3; //if 0 就进行比较

    BEQ strcmp;//如过相等继续比较;

return:

    SUB R0,R2,R3;//不等,判断两者大小;

    MOV PC,LR;


2.子程序进入和退出时数据的保存和恢复


R0~R3通常用作传递传输和返回结果,这几个值由程序调用这来保存,但是其他寄存器需要在入口保存,然后返回的时候恢复;


func:

    STMFD R13!,{R4-R12,R14};

    ....

    LDMFD R13!,{R4-R12,PC};


3.SWI中断程序示例


SWI在特权模式下请求特定的系统服务,这里只是简单演练一下处理SWI 软件中断的过程,不做过多说明:


SWIHandler:

    STMFD SP!,{R0-R3,R12,LR};

    MRS R0,SPSR;//获取状态寄存器放到R0中;

    TST R0,#0X20;//判断程序状态是否为ARM状态;

    LDRNEH R0,[LR,#-2];//如果是Thumb状态;

    LDREQ R0,[LR,#-4];//如果是ARM状态;

    BICEQ R0,R0,#0XFF000000;

    CMP R0,#MAXSWI;//是否超出合法范围;

    LDRLS PC,[PC,R0,LSL #2];

    //跳转到相应的服务程序执行;

    //ls为条件: 低于或同于(无符号) 如果一次比较操作之后清除了 C 标志或设置了 Z 标志。成立的话pc = pc+(r0*4);


    B SWIOutOfRange//超出合法范围;

Switable://各服务程序函数地址表;

    DCD do_swi_0

    DCD do_swi_1

do_swi_0: //服务程序的代码;

    ...

    LDMFD SP!,{R0-R3,R12,PC}^ //从服务程序当中返回;


参考书籍


ARM体系结构编程 - 杜春雷


附件添加条件码:

这里写图片描述

关键字:ARM  寄存器  寻址方式  指令 引用地址:ARM基础学习-寄存器寻址方式和指令

上一篇:ARM基础学习-寄存器
下一篇:ARM基础学习-ATPCS子程序调用基本规范

推荐阅读最新更新时间:2024-11-13 10:24

8051单片机教程第十一课:算术运算类指令
不带进位位的加法指令 ADDA,#DATA;例:ADDA,#10H ADDA,direct;例:ADDA,10H ADDA,Rn;例:ADDA,R7 ADDA,@Ri;例:ADDA,@R0 用途:将A中的值与其后面的值相加,最终结果否是回到A中。 例:MOVA,#30H ADDA,#10H 则执行完本条指令后,A中的值为40H。 下面的题目自行练习 MOV34H,#10H MOVR0,#13H MOVA,34H ADDA,R0 MOVR1,#34H ADDA,@R1 带进位位的加法指令 ADDCA,Rn ADDCA,direct ADDCA,@Ri A
[单片机]
物联网的突破口在无人驾驶?ARM借Mali-C71发力GPU
    为了争夺通往物联网世界的船票,孙正义花了320亿美元。他眼中下一个阿里巴巴,正是专注芯片设计的ARM。扼守未来的咽喉,一切代价都相当超值。   日前,ARM正式发布Mali-C71图像信号处理器(ISP),应对汽车图像处理所面临的挑战,包括在极端条件下对图像进行快速的处理和分析,符合严苛的汽车安全标准的设计要求。Mali-C71也是ARM Mali Camera系列的第一款产品。   无人驾驶汽车正在成为半导体先驱镜像追逐的热点,如高通推出骁龙车用处理器、三星电子与奥迪联姻、英伟达和梅赛德斯奔驰合作等。这一次ARM来了,它将如何改变这一行业呢?      可怕的是,ARM在移动领域似乎没有天敌。从Cortex-A7
[嵌入式]
ARM处理器各个模式之间是如何切换的?
1、ARM处理器各个模式之间是如何切换的? 答:除用户模式外的其他6种模式称为特权模式,这些模式中,程序可以访问所有系统资源,也可以任意进行处理器模式的切换。处理器模式可以通过软件控制进行切换(直接设置CPSR寄存器的后五位就可以在6种特权模式之间互相切换),也可以通过外部中断或异常处理过程进行切换(例如,在USR模式下,发生中断后切换到IRQ模式)。 2、ARM各个模式之间切换时,上下文的保存哪些是硬件在做?哪些是操作系统在做? 答:CPU做的: (1)把返回地址保存到相应模式的lr寄存器中,例如从usr模式切换到irq模式,CPU会将usr模式下的pc值,保存到irq模式下的lr寄存器中。 (2)保存CPS
[单片机]
ARM cortexM4 异常处理(1)
在嵌入式开发中,尤其是在ARM的程序开发中,对异常的处理起着至关重要作用,那么cortexM4内核是如何管理异常的呢?我们将分几个小篇来讲解异常,今天先来了解下基本知识 异常状态 每一中异常总共有四种状态: 非激活态:异常没有被激活且没有被挂起。 挂起态: 异常等待处理器服务,一个外设的中断或者软件中断请求可以改变 相应中断的状态到挂起态,中断其实也是一种异常。 激活态: 处理器正在处理异常且还没有完成。 激活且挂起态:这种状态显然从字面意思理解就是激活态和挂起态的组合,即 处理器正在服务于异常时,有来自于同源的挂起异常 异常类型 Reset 复位:异常模式将复位看做是一种特殊类型的异常。 NMI
[单片机]
1.5.6_按键中断程序示例_完善
中对概述和初始化做了初步的介绍,现在来完善整个按键中断程序。 当按键中断发生时,CPU会跳到0x18地址执行,和之前类似,我们通过word让CPU跳到do_irq执行。 这里的lr_irq保存的是下一条指令的地址+4,所以要先减4再存。 通过handle_irq_c这个中断处理函数来处理中断,这里我们使用了一个函数指针数组,将各个中断对应的处理函数使用数组来调用。相应的,也增加了注册函数,在初始化中断时进行注册。 大致处理的流程就是这样。 下面整理一下,首先是设置中断源,然后是初始化相关的中断配置,注册中断处理函数。大致就是这三步。 中断处理完之后,需要清楚中断源和中断标志位,注意从中断源开始从后往前清
[单片机]
1.5.6_按键中断程序示例_完善
ARM多核和MIPS多执行绪---嵌入式处理器技术剖析
在嵌入式装置中建置多核心(包含同质或异质)以及多执行绪技术,的确能带来诸多效益,尤其是改进系统效能方面最为明显。 尽管RISC嵌入式技术所面临的挑战越来越多,但是在维持以往嵌入式软件资源兼容性的前提之下,能够改善其未来适用性,并且有效提升新系统的效能表现,使其不失为良好的解决方案。 应用决定多核或多绪 多核心与多执行绪在效能表现上有其帮助,但是效能与这些技术的内建其实并没有绝对关系,会造成这样的原因主要是应用环境的需求。以手机为例,整合于手机内的SoC芯片虽然是属于多核心架构的一环,但是手机采用的SoC芯片多为应用处理器,其整合的核心并非完全属于同性质架构,同质多核心在嵌入式系统实际应用上的案例其实非常少。 而多执
[单片机]
<font color='red'>ARM</font>多核和MIPS多执行绪---嵌入式处理器技术剖析
基于ARM平台的数字滤波器的软件实现方法
数字滤波器作为语音与图象处理、模式识别、雷达信号处理、频谱分析等应用中最基本的处理部件,现已成为最常用的工具之一。它既能满足滤波器对幅度和相位特性的严格要求,又能避免模拟滤波器所无法克服的电压漂移、温度漂移和噪声等问题。而对于具有线性相位特性的滤波问题,设计时一般都选择FIR滤波器。 相对于窗函数法和频率设计法,在将理 数字滤波器作为语音与图象处理、模式识别、雷达信号处理、频谱分析等应用中最基本的处理部件,现已成为最常用的工具之一。它既能满足滤波器对幅度和相位特性的严格要求,又能避免模拟滤波器所无法克服的电压漂移、温度漂移和噪声等问题。而对于具有线性相位特性的滤波问题,设计时一般都选择FIR滤波器。 相对于窗
[单片机]
基于<font color='red'>ARM</font>平台的数字滤波器的软件实现方法
STM32学习之路入门篇之指令集及cortex——m3的存储系统
一、汇编语言基础 一)、汇编语言:基本语法 1、汇编指令最典型的书写模式: 标号 操作码 操作数1, 操作数2,... ;注释 1)、标号是可选的,如果有,它必须顶格写。标号的作用是让汇编器来计算程序转移的地址。 2)、操作码是指令的助记符,它的前面必须有至少一个空白符,通常使用提个Tab键来产生。 3)、操作码后面往往跟若干个操作数,而第一个操作数,通常都给出本指令执行结果的存储地。不同指令需要不同数目的操作数,并且对操作数的语法要求也可以不同。 4)、注释均以;开头,它的有无不影响汇编操作,只是给程序员看的,让程序员更加可以理解代码。 2、可以使用EQU指示子来定义常数
[单片机]
STM32学习之路入门篇之<font color='red'>指令</font>集及cortex——m3的存储系统
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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