历史上的今天
返回首页

历史上的今天

今天是:2024年10月05日(星期六)

正在发生

2018年10月05日 | ARM学习_六大类指令集

2018-10-05 来源:eefocus

ARM的六大类指令集---LDR、LDRB、LDRH、STR、STRB、STRH

ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。常用的加载存储指令如下:

—  LDR     字数据加载指令

— LDRB    字节数据加载指令

—  LDRH    半字数据加载指令

—  STR     字数据存储指令

—  STRB    字节数据存储指令

—  STRH    半字数据存储指令

1、LDR指令

LDR指令的格式为:

LDR{条件} 目的寄存器,<存储器地址>

LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令在程序设计中比较常用,且寻址方式灵活多样,请读者认真掌握。

指令示例:

LDR   R0,[R1]                  ;将存储器地址为R1的字数据读入寄存器R0。

LDR   R0,[R1,R2]             ;将存储器地址为R1+R2的字数据读入寄存器R0。

LDR   R0,[R1,#8]             ;将存储器地址为R1+8的字数据读入寄存器R0。

LDR   R0,[R1,R2] !           ;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。

LDR   R0,[R1,#8] !          ;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。

LDR   R0,[R1],R2              ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1。

LDR   R0,[R1,R2,LSL#2]!   ;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

LDR   R0,[R1],R2,LSL#2     ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

2、LDRB指令

LDRB指令的格式为:

LDR{条件}B 目的寄存器,<存储器地址>

LDRB指令用于从存储器中将一个8位的字节数据传送到目的寄存器中,同时将寄存器的高24位清零。该指令通常用于从存储器中读取8位的字节数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。

指令示例:

LDRB R0,[R1]         ;将存储器地址为R1的字节数据读入寄存器R0,并将R0的高24位清零。

LDRB R0,[R1,#8]    ;将存储器地址为R1+8的字节数据读入寄存器R0,并将R0的高24位清零。

3、LDRH指令

LDRH指令的格式为:

LDR{条件}H 目的寄存器,<存储器地址>

LDRH指令用于从存储器中将一个16位的半字数据传送到目的寄存器中,同时将寄存器的高16位清零。该指令通常用于从存储器中读取16位的半字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。

指令示例:

LDRH R0,[R1]         ;将存储器地址为R1的半字数据读入寄存器R0,并将R0的高16位清零。

LDRH R0,[R1,#8]    ;将存储器地址为R1+8的半字数据读入寄存器R0,并将R0的高16位清零。

LDRH R0,[R1,R2]    ;将存储器地址为R1+R2的半字数据读入寄存器R0,并将R0的高16位清零。

4、LDM指令:

L的含义仍然是LOAD,即是Load from memory into register。

虽然貌似是LDR的升级,但是,千万要注意,这个指令运行的方向和LDR是不一样的,是从左到右运行的。该指令是将内存中堆栈内的数据,批量的赋值给寄存器,即是出栈操作;其中堆栈指针一般对应于SP,注意SP是寄存器R13,实际用到的却是R13中的内存地址,只是该指令没有写为[R13],同时,LDM指令中寄存器和内存地址的位置相对于前面两条指令改变了,下面的例子:

LDMFD     SP! ,   {R0, R1, R2}

实际上可以理解为:    LDMFD     [SP]!,    {R0, R1, R2}

意思为:把sp指向的3个连续地址段(应该是3*4=12字节(因为为r0,r1,r2都是32位))中的数据拷贝到r0,r1,r2这3个寄存器中去。

5、STR指令

STR指令的格式为:

STR{条件} 源寄存器,<存储器地址>

STR指令用于从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可参考指令LDR。

指令示例:

STR   R0,[R1],#8    ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。

STR   R0,[R1,#8]    ;将R0中的字数据写入以R1+8为地址的存储器中。

6、STRB指令

STRB指令的格式为:

STR{条件}B 源寄存器,<存储器地址>

STRB指令用于从源寄存器中将一个8位的字节数据传送到存储器中。该字节数据为源寄存器中的低8位。

指令示例:

STRB R0,[R1]         ;将寄存器R0中的字节数据写入以R1为地址的存储器中。

STRB R0,[R1,#8]    ;将寄存器R0中的字节数据写入以R1+8为地址的存储器中。

7、STRH指令

STRH指令的格式为:

STR{条件}H 源寄存器,<存储器地址>

STRH指令用于从源寄存器中将一个16位的半字数据传送到存储器中。该半字数据为源寄存器中的低16位。

指令示例:

STRH R0,[R1]         ;将寄存器R0中的半字数据写入以R1为地址的存储器中。

STRH R0,[R1,#8]    ;将寄存器R0中的半字数据写入以R1+8为地址的存储器中。

8、STM指令:

S的含义仍然是STORE,与LDM是配对使用的,其指令格式上也相似,即区别于STR,是将堆栈指针写在左边,而把寄存器组写在右边。

   STMFD      SP!,   {R0}

同样的,该指令也可理解为:  STMFD      [SP]!,   {R0}

意思是:把R0保存到堆栈(sp指向的地址)中。


推荐阅读

史海拾趣

Herth+Buss Fahrzeugteile GmbH & Co KG公司的发展小趣事
用于防止非法入侵或提醒人员注意。
Ava Electronics Corp公司的发展小趣事

随着产品线的不断丰富和技术的不断进步,AVA电子开始将目光投向更广阔的市场。公司积极参加各类行业展会和论坛,与国内外客户建立了广泛的联系。同时,AVA电子还加大了品牌建设的力度,通过广告宣传、品牌推广等方式提高了品牌的知名度和美誉度。这些举措不仅有效提升了公司的市场份额,也为公司的长远发展奠定了坚实的基础。

Blue Sky Research公司的发展小趣事

随着产品技术的成熟和稳定,Blue Sky Research开始积极拓展市场。公司不仅在国内市场取得了良好的销售业绩,还成功打开了国际市场的大门。通过参加国际电子展会、建立海外销售网络等方式,Blue Sky Research的品牌知名度和影响力逐渐提升。同时,公司还注重品牌建设,通过提供优质的产品和服务,赢得了客户的信任和好评。

永丰盈(CST)公司的发展小趣事

品质是CST的生命线。为了确保产品质量的稳定性和可靠性,公司建立了完善的质量管理体系,严格执行ISO9001质量体系及ISO14001环境体系。同时,公司还注重员工的培训和教育,提高员工的质量意识和操作技能。这些措施使得CST的产品质量得到了客户的广泛认可。

Cal-Chip Electronics公司的发展小趣事

Cal-Chip Electronics公司的创始人[创始人姓名]在XXXX年怀揣着对电子技术的热爱和对市场需求的敏锐洞察,决定创立这家公司。初期,公司面临着资金短缺、人才匮乏和技术难题等多重挑战。然而,[创始人姓名]凭借坚定的信念和不懈的努力,成功吸引了第一批投资者,并组建了一支由行业精英组成的核心团队。通过不断的技术研发和市场调研,公司逐渐在半导体芯片领域站稳了脚跟。

Condor公司的发展小趣事

在快速发展的过程中,Cal-Chip Electronics公司始终关注社会责任和可持续发展。公司积极参与公益事业,支持教育、环保等领域的发展。同时,公司还注重环保生产,通过引进先进的环保技术和设备,减少生产过程中的污染排放。此外,公司还建立了完善的员工培训体系,为员工提供广阔的职业发展空间。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

以上是关于Cal-Chip Electronics公司在电子行业发展的5个相关故事,这些故事展示了公司在不同历史阶段所取得的成就和面临的挑战。通过不断努力和创新,Cal-Chip Electronics公司已经成为了电子行业的一颗璀璨明星。

问答坊 | AI 解惑

[转帖]招聘嵌入式系统程序员 C语言测试

C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为带面试者和被面试者提供许多有用信息,此外,撇开面试的压力不谈,这种测试也是相当有趣的。 从被面试者的角度来 ...…

查看全部问答>

飞思卡尔HCS08和coldfire v1 KBI教程

这是我们写的一个教程,适用于飞思卡尔的HCS08系列单片机和coldfire v1系列的MCU…

查看全部问答>

VxWorks应用层通信程序

  有在VxWorks应用层通信的软件没,比如传送一个文件或一串消息? 请各位高手指点?…

查看全部问答>

你第一linux操作系统是什么,你现在用什么linux操作系统

  调查,我的第一个linux操作系统是ubuntu,我从09年暑假开始接触linux,装的就是ubuntu8.04,然后虽然接触过fedora,redhat,debian,suse等,但一直觉得ubuntu爽快,哈哈,现在一直在用ubuntu,甚至开发FPGA,大家呢,欢迎大家讨论…

查看全部问答>

DIY数控电源进度帖

安装了controlSUIT,开始回顾TI的例程,用官方的.c文件,建了工程,编译通过了。 Piccolo的资料相对没有2812那么多。进度不是很快,有压力啊。…

查看全部问答>

ucosII 移植到LM3S9B92上还真是不简单

一直想把ucosII V2.92移植到LM3S9B92上去,但前前后后搞了将近三个星期了,还是没有一点结果,指针总是越界,第一个任务还没启动起来就会进入死循环,真是郁闷啊。…

查看全部问答>

DAC功放电路

用DAC做了个因为播放器,又用LM386做了个功放,想问一下在将dac输出接到LM386的输入端前是不是要加入滤波电路呢?不知道为什么,噪音好大…

查看全部问答>

为什么EPM570会被程序弄死?

写了个串口调试程序用来测试板子各个工作点状态的,但是居然第一次烧录几次后CPLD就不能再烧录了干脆坏掉了,只能换芯片,要知道100脚的epm570更换起来多费时间。是不是程序导致芯片内部短路了?…

查看全部问答>

【NUCLEO-F410RB】2.给nucleo移植上ucos-ii,用信号量实现led闪烁

本帖最后由 caizhiwei 于 2015-12-6 17:17 编辑      虽然管理员寄过来的板子不能用,但是还得完成任务。所以抽出时间把ucos-ii移植上另外一块Nucleo板子上,奉上工程源码,供大家享用~~ int main(void) {     ...…

查看全部问答>

LED恒流驱动电源最新

我有个论文要写,关于LED恒流驱动的,市面是否有新颖或新款的电路。有创新点的。评职称用很愁啊。 …

查看全部问答>