历史上的今天
返回首页

历史上的今天

今天是:2024年11月26日(星期二)

正在发生

2021年11月26日 | ARM基础学习-寄存器寻址方式和指令

2021-11-26 来源:eefocus

寻址方式


数据都存在存储器中,寻址简单地说就是找到存储数据或指令的地址。存储器有很多存储单元,用于存储数据。或者说,寻址就是读取数据所在储存装置中对应地址编号中存储的内容;寻址方式是指某一个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体系结构编程 - 杜春雷


附件添加条件码:

这里写图片描述

推荐阅读

史海拾趣

CHENMKO公司的发展小趣事

非常抱歉,由于CHENMKO并非一个我所熟知的电子行业中的具体公司名称,我无法直接为您提供关于其发展起来的5个相关故事。如果您提到的“CHENMKO”是一个虚构的或者不太知名的公司,那么相关的具体故事就需要您自己创作或者查找相关资料。

然而,我可以提供您一个电子行业公司发展的通用故事框架,您可以根据这个框架和您的具体需求来创作或寻找更多信息。

电子行业公司发展故事框架

  1. 创业初期
    • 描述公司的创始人和初创团队,他们是如何发现市场机会的。
    • 讲述公司初创时期的艰难和挑战,比如资金短缺、技术难题等。
    • 介绍公司早期产品的特点,以及如何在市场上获得初步认可。
  2. 技术创新与突破
    • 描述公司在某一技术领域取得的重大突破,如研发出新技术、新产品。
    • 分析这一技术创新如何帮助公司在市场上获得竞争优势。
    • 讲述技术创新过程中遇到的困难以及克服这些困难的过程。
  3. 市场拓展与合作
    • 描述公司如何逐步扩大市场份额,比如通过开拓新市场、拓展产品线等。
    • 介绍公司与其他企业或机构的合作案例,以及这些合作带来的好处。
    • 分析公司在市场拓展过程中面临的挑战和应对策略。
  4. 品牌建设与形象提升
    • 讲述公司如何通过品牌建设提升市场影响力,比如参加行业展会、举办发布会等。
    • 介绍公司如何塑造积极的品牌形象,如强调社会责任、环保理念等。
    • 分析品牌建设对公司长期发展的重要性。
  5. 未来发展与展望
    • 描述公司的未来发展规划,如继续技术创新、拓展国际市场等。
    • 分析行业发展趋势和市场竞争态势,以及公司如何应对这些挑战。
    • 展望公司的未来发展前景和可能面临的机遇与挑战。

请注意,以上框架是一个通用的模板,您可以根据CHENMKO公司的实际情况进行调整和修改。如果您需要更具体的信息或故事,建议您查找该公司的官方网站、新闻报道或行业分析报告等渠道获取相关资料。

Daniels Manufacturing公司的发展小趣事

在当今社会,绿色环保和可持续发展已成为全球共识。作为一家具有社会责任感的企业,DMC积极践行绿色环保理念,致力于实现可持续发展。在生产过程中,DMC采用环保材料和清洁能源,减少废弃物和污染物的排放。同时,DMC还注重产品的环保性能设计,推出了一系列符合环保标准的产品。此外,DMC还积极参与社会公益活动,支持环保事业和社区建设。

酷宅(Coolkit)公司的发展小趣事

酷宅科技自成立以来,一直致力于智能家居技术的研发和应用。2016年,酷宅与荣事达品冠达成战略协议,共同打造智能家居开放平台。这一平台不仅集成了酷宅先进的物联网应用技术和稳定的云端服务,还整合了荣事达在智能家居领域的丰富经验和资源。通过合作,双方共同推动智能家居产业的发展,为消费者提供更加便捷、智能的家居生活体验。

Aerotronics Marketing Inc公司的发展小趣事

Aerotronics Marketing Inc公司在电子行业中崭露头角,源于其一项革命性的无人机技术。公司研发团队历经数年努力,成功开发出一款具有高精度导航和稳定飞行能力的无人机,广泛应用于农业监测、地质勘探等领域。这一技术的推出,不仅填补了市场空白,还为公司赢得了大量订单和合作伙伴,推动了公司的快速发展。

长江连接器(CJT)公司的发展小趣事

随着技术的不断积累和市场的不断扩大,长江连接器开始积极拓展国内外市场。公司通过与国内外知名企业的合作,将产品广泛应用于消费类电子、电气电子、薄膜开关、LED显示器屏/灯饰、家用电器、电脑及电脑周边、通讯设备等领域。同时,长江连接器注重品牌形象的塑造和推广,通过参加各类行业展会、举办技术交流会等方式提升品牌知名度和美誉度。

Gigarams Semiconductor Device Corp公司的发展小趣事
这可能是由于定位力量不够或初始力矩过大导致的。解决方案包括调整定位参数、优化启动策略或增加缓冲装置以减少振动。

问答坊 | AI 解惑

LDO低压差线性稳压器

LDO  LDO是low dropout regulator,意为低压差线性稳压器,是相对于传统的线性稳压器来说的。传统的线性稳压器,如78xx系列的芯片都要求输入电压要比输出电压高出2v~3V以上,否则就不能正常工作。但是在一些情况下,这样的条件显然是太苛刻了,如 ...…

查看全部问答>

wince 驱动工程师真的要自己编驱动吗 还是移植的多

wince 驱动工程师真的要自己编驱动吗  还是移植的多…

查看全部问答>

2410 I2C 在什么情况下产生中断?

最近一段时间,接触了好几个具有 I2C 接口的从设备器件; 也对 I2C 的 WinCE 流驱动也有所了解。 开始用【查询】方式实现了一个 I2C 流驱动; 现在准备用【中断】方式实现 I2C 流驱动; 但是看了好几遍【2410数据手册】,都没有看明白; 2410 ...…

查看全部问答>

关于89c51中断不响应的问题

菜鸟才接触89c51,写的如下代码,但是中断不响应,我在INT0输入的是方波信号,还有这块是16位寻址哈 也就是unsigned int 型最大值是65536哈,我想是让int0为高电平时,计数器开始计数,当int0下一个高电平到来 之后计数器重新计数,一直这样循环 ...…

查看全部问答>

PLC与变频器的组合应用

                                      &n ...…

查看全部问答>

请教关于UC2843或者UC3843的占空比的计算的问题

下面这个框图是UC2843芯片的内部框图,现在想请教的是反馈电压、反馈电流和输出占空比的计算公式,手册上都没有介绍这个计算关系到底是什么样子的。谢谢!…

查看全部问答>

晒WEBENCH设计的过程+Arria系列10AT090电源驱动电路设计

需求:输入,14到22V         输出: # Name VLoad ILoad Description 1. LOAD #1 3.3 V 0.5 A VoutRipple=10% 2. LOAD #2 5 V 0.5 A VoutRipple=10% 3. VCC 0.9 V 41.304 A VoutRipple=10% 4. VCCA_PLL 1.8 V ...…

查看全部问答>

初学者很受用的记录

初学者和受用的PCB设计记录 …

查看全部问答>

Nucelo-L432KC6开发板硬件分析

NUCLEO-L432KC硬件分析Nucleo-L432KC开发板是Nucleo-32系列开发板中最新的一款,它采用了STM32L432KC6微控制器,除了具有良好的性能外,还支持超低功耗。 STM32L432KC控制器的主要特性: ARM®32-bit Cortex®-M4 CPU80 MHz max CPU fr ...…

查看全部问答>

MMA7455三轴加速度传感器

求MMA7455spi通信程序,自己写的总是通信不上…

查看全部问答>