当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]Thumb指令集支持寄存器的装载和存储,即LDR和STR指令。8和类型的Load/Store指令在Thumb指令集中可用。这些指令使用两种寻址模式:寄存器偏移和立即数偏移。指令所能存取的数据包括字、半字和字节,同时半字和字节可以为有符号数或无符号数。

11.5单寄存器数据传送指令

Thumb指令集支持寄存器的装载和存储,即LDR和STR指令。8和类型的Load/Store指令在Thumb指令集中可用。这些指令使用两种寻址模式:寄存器偏移和立即数偏移。指令所能存取的数据包括字、半字和字节,同时半字和字节可以为有符号数或无符号数。

表11.4总结了Thumb状态下可用的数据传送指令。

表11.4 Thumb状态数据传送指令

助记符

说明

操作

LDR

传送32位字到寄存器

Rd<-mem32[address]

STR

存储32位寄存器的值

Rd->mem32[address]

LDRB

传送8位字节到寄存器

Rd<-mem8[address]

STRB

保存寄存器中的字节

Rd->mem8[address]

LDRH

传送16位半字到寄存器

Rd<-mem16[address]

STRH

保存寄存器中的半字

Rd->mem16[address]

LDRSB

装载有符号字节到寄存器

Rd<-sighExtend(mem8[address])

STRSB

装载有符号半字到寄存器

Rd<-sighExtend(mem16[address])

Thumb数据传送指令的基本语法格式分为以下4种。

①<opcode1><Rd>,[<Rn>,#<5_bit_offset>]

其中,<opcode1>:=LDR|LDRH|LDRB|STR|STRH|STRB

②<opcode2><Rd>,[<Rn>,<Rm>]

其中,<opcode2>:=LDR|LDRH|LDRB|LSRSH|STR|STRH|STRB

③LDR<Rd>,[PC,<8_bit_offset>]

④<opcode3><Rd>,[SP,#<8_bit_offset>]

其中,<opcode3>:=LDR|STR

下面详细介绍各数据传送指令的语法和使用。

11.5.1寄存器装载指令LDR(1)

(1)编码格式

寄存器装载指令LDR(1)的编码格式如图11.42所示。

图11.42LDR(1)指令的编码格式

这种形式的LDR指令将32位内存数据装载到通用寄存器。常用于结构体的数据访问。域的基地址放在Rn寄存器中。

(2)指令的语法格式

LDR<Rd>,[<Rn>,#<immed_5>*4]

①<Rd>

目的寄存器。用于存放从内存中取出的数据。

②<Rn>

基址寄存器,用于存放所取数据的基地址。

③<immed_5>

5位立即数。该立即数的4倍加上基址寄存器的值形成目标地址。

(3)指令操作的伪代码

Address=Rn+(immed_5*4)

Ifaddress[1:0]==0b00

Data=Memory[address,4]

Else

Data=UNPREDICTABLE

Rd=data

(4)对应的ARM指令

LDR<Rd>,[<Rn>,#<immed_5>*4]

注意

如果指令访问地址非字对齐,则指令的执行结果不可预知。

11.5.2寄存器装载指令LDR(2)

(1)编码格式

寄存器装载指令LDR(2)的编码格式如图11.43所示。

图11.43LDR(2)指令的编码格式

寄存器装载指令LDR(2)允许将一个32位内存数据装载到通用寄存器。此种形式的LDR指令常被用于访问数组中的元素。

(2)指令的语法格式

LDR<Rd>,[<Rn>,<Rm>]

①<Rd>

目的寄存器。

②<Rn>

寄存器存放内存访问基地址。

③<Rm>

寄存器存放内存访问偏移地址。

(3)指令操作的伪代码

Address=Rn+Rm

Ifaddress[1:0]==0b00

Data=Memory[address,4]

Else

Data=UNPREDICTABLE

Rd=data

(4)对应的ARM指令

LDR<Rd>,[<Rn>,<Rm>]

11.5.3寄存器装载指令LDR(3)

(1)编码格式

寄存器装载指令LDR(3)的编码格式如图11.44所示。

图11.44LDR(3)指令的编码格式

寄存器装载指令LDR(3)允许将一个32位内存数据装载到通用寄存器。此种形式的LDR指令常被用于访问PC相关(PC-relative)数据。

(2)指令的语法格式

LDR<Rd>,[PC,#<immed_8>*4]

①<Rd>

目的寄存器。

②PC

程序指针寄存器,用于计算内存访问的地址。计算地址时,PC值的bit[1]被系统默认为0进行计算,所以产生的内存访问地址必为字对齐。

③<immed_8>

8位立即数。该立即数的4倍将和PC值相加,形成内存访问地址。

(3)指令操作的伪代码

Address=(PC[31:2]<<2)+(immed_8*4)

Rd=Memory[address,4]

(4)对应的ARM指令

LDR<Rd>,[PC,#<immed_8>*4]

11.5.4寄存器装载指令LDR(4)

(1)编码格式

寄存器装载指令LDR(4)的编码格式如图11.45所示。

图11.45LDR(4)指令的编码格式

寄存器装载指令LDR(4)允许将一个32位内存数据装载到通用寄存器。此种形式的LDR指令常被用于访问堆栈数据。

(2)指令的语法格式

LDR<Rd>,SP,#<immed_8>*4]

①<Rd>

目的寄存器。

②SP

堆栈指针寄存器,用于计算内存访问地址。

③<immed_8>

8位立即数。该立即数的4倍将和SP值相加,形成内存访问地址。

(3)指令操作的伪代码

Address=SP+(immed_8*4)

Ifaddress[1:0]==0b00

Data=memory[address,4]

Else

Data=UNPREDICTABLE

Rd=data

(4)对应的ARM指令

LDR<Rd>,[SP,#<immed_8>*4]

11.5.5字节加载指令LDRB(1)

(1)编码格式

字节加载指令LDRB(1)的编码格式如图11.46所示。

图11.46LDRB(1)指令的编码格式

LDRB(1)字节数据加载指令用于从内存中将一个8位的字节数据读取到指令中的目标寄存器中,并将寄存器的高24位清零。常用于结构体的数据访问。域的基地址放在Rn寄存器中。

(2)指令的语法格式

LDRB<Rd>,[<Rn>,#<immed_5>]

①<Rd>

目的寄存器。

②<Rn>

指令的基址寄存器。

③<immed_5>

5位立即数。用于与<Rn>寄存器中的数值相加,形成内存访问地址。

(3)指令操作的伪代码

address=Rn+immed_5

Rd=memory[address,1]

(4)对应的ARM指令

LDRB<Rd>,[<Rn>,#<immed_5>]

11.5.6字节加载指令LDRB(2)

(1)编码格式

字节加载指令LDRB(2)的编码格式如图11.47所示。

图11.47LDRB(2)指令的编码格式

LDRB(2)字节数据加载指令用于从内存中将一个8位的字节数据读取到指令中的目标寄存器中,并将寄存器的高24位清零。此种形式的LDRB(2)指令常用于数组元素的访问。

(2)指令的语法格式

LDRB<Rd>,[<Rn>,<Rm>]

①<Rd>

目的寄存器。

②<Rn>

存放形成内存访问地址的第一个寄存器。

③<Rm>

存放形成内存访问地址的第二个寄存器。

(3)指令操作的伪代码

address=Rn+Rm

Rd=Memory[address,1]

(4)对应的ARM指令

LDRB<Rd>,[<Rn>,<Rm>]

11.5.7半字加载指令LDRH(1)

(1)编码格式

半字数据加载指令LDRH(1)的编码格式如图11.48所示。

图11.48LDRH(1)指令的编码格式

LDRH(1)半字数据加载指令用于从内存中将一个16位的半字数据读取到指令中的目标寄存器中,并将寄存器的高16位清零。常用于结构体的数据访问。域的基地址放在Rn寄存器中。

(2)指令的语法格式

LDRH<Rd>,[<Rn>,#<immed_5>*2]

①<Rd>

目的寄存器。

②<Rn>

指令的基址寄存器。

③<immed_5>

5位立即数。该寄存器数值的2倍将与<Rn>寄存器中的数值相加,形成内存访问地址。

(3)指令操作的伪代码

address=Rn+(immed_5*2)

ifaddress[0]==0

data=Memory[address,2]

else

data=UNPREDICTABLE

Rd=data

(4)对应的ARM指令

LDRH<Rd>,[<Rn>,#<immed_5>*2]

11.5.8半字数据加载指令LDRH(2)

(1)编码格式

半字数据加载指令LDRH(2)的编码格式如图11.49所示。

LDRH(2)字节数据加载指令用于从内存中将一个16位的半字数据读取到指令中的目标寄存器中,并将寄存器的高16位清零。此种形式的LDRH(2)指令常用于数组元素的访问。

图11.49LDRH(2)指令的编码格式

(2)指令的语法格式

LDRB<Rd>,[<Rn>,<Rm>]

①<Rd>

目的寄存器。

②<Rn>

此寄存器存放内存访问基地址。

③<Rm>

此寄存器存放内存访问偏移地址。

(3)指令操作的伪代码

address=Rn+Rm

ifaddress[0]==0

data=memory[address,2]

else

data=UNPREDICTABLE

Rd=data

(4)对应的ARM指令

LDRH<Rd>,[<Rn>,<Rm>]

11.5.9有符号字节数据加载指令LDRSB

(1)编码格式

有符号字节数据加载指令LDRSB的编码格式如图11.50所示。

图11.50LDRSB指令的编码格式

LDRSB指令用于从内存中将一个8位的字节数据读取到指令中的目标寄存器中,并将寄存器的高24位设置成该字节数据的符号位的值(即将该8位字节数据进行符号位扩展,生成32位字数据)。

(2)指令的语法格式

LDRSB<Rd>,[<Rn>,<Rm>]

①<Rd>

目的寄存器。

②<Rn>

此寄存器存放内存访问基地址。

③<Rm>

此寄存器存放内存访问偏移地址。

(3)指令操作的伪代码

address=Rn+Rm

Rd=SignExtend(Memory[address,1])

(4)对应的ARM指令

LDRSB<Rd>,[<Rn>,<Rm>]

11.5.10有符号半字数据加载指令LDRSH

(1)编码格式

有符号字节数据加载指令LDRSH的编码格式如图11.51所示。

图11.51LDRSH指令的编码格式

LDRSH指令用于从内存中将一个16位的半字数据读取到指令中的目标寄存器中,并将寄存器的高16位设置成该半字数据的符号位的值(即将该16位半字数据进行符号位扩展,生成32位字数据)。

(2)指令的语法格式

LDRBH<Rd>,[<Rn>,<Rm>]

①<Rd>

目的寄存器。

②<Rn>

此寄存器存放内存访问基地址。

③<Rm>

此寄存器存放内存访问偏移地址。

(3)指令操作的伪代码

address=Rn+Rm

ifaddress[0]==0

data=memory[address,2]

else

data=UNPREDICTABLE

Rd=SignExtend[data]

(4)对应的ARM指令

LDRSH<Rd>,[<Rn>,<Rm>]

11.5.11寄存器存储指令STR(1)

(1)编码格式

寄存器存储指令STR(1)的编码格式如图11.52所示。

图11.52STR(1)指令的编码格式

这种形式的STR指令将32位通用寄存器的数值存储到内存中。该指令常用于结构体的数据访问。域的基地址放在Rn寄存器中。

(2)指令的语法格式

STR<Rd>,[<Rn>,#<immed_5>*4]

①<Rd>

目的寄存器。用于存放从内存中取出的数据。

②<Rn>

基址寄存器,用于存放所取数据的基地址。

③<immed_5>

5位立即数。该立即数的4倍加上基址寄存器的值为目标地址。

(3)指令操作的伪代码

address=Rn+(immed_5*4)

ifaddress[1:0]==0b00

Memory[address,4]=Rd

Else

Memory[address,4]=UNPREDICTABLE

(4)对应的ARM指令

STR<Rd>,[<Rn>,#<immed_5>*4]

11.5.12寄存器存储指令STR(2)

(1)编码格式

寄存器存储指令STR(2)的编码格式如图11.53所示。

图11.53STR(2)指令的编码格式

寄存器装载指令STR(2)将一个32位通用寄存器数据存储到内存单元中。此种形式的STR指令常被用于访问数组中的元素。

(2)指令的语法格式

LDR<Rd>,[<Rn>,<Rm>]

①<Rd>

目的寄存器。

②<Rn>

存放形成内存访问地址的第一个寄存器。

③<Rm>

存放形成内存访问地址的第二个寄存器。

(3)指令操作的伪代码

address=Rn+Rm

ifaddress[1:0]==0b00

Memory[address,4]==Rd

Else

Memory[address,4]==UNPREDICTABLE

(4)对应的ARM指令

STR<Rd>,[<Rn>,<Rm>]

11.5.13寄存器存储指令STR(3)

(1)编码格式

寄存器存储指令STR(3)的编码格式如图11.54所示。

图11.54STR(3)指令的编码格式

寄存器存储指令STR(3)允许将一个32位通用寄存器的值存储到内存。此种形式的STR指令常被用于访问堆栈数据。

(2)指令的语法格式

STR<Rd>,[SP,#<immed_8>*4]

①<Rd>

目的寄存器。

②SP

堆栈指针寄存器,用于计算内存访问的地址。

③<immed_8>

8位立即数。该立即数的4倍将和堆栈指针寄存器SP的值相加,形成内存访问地址。

(3)指令操作的伪代码

address=SP+(immed_8*4)

ifaddress[1:0]==0b00

Memory[address,4]=Rd

Else

Memory[address,4]=UNPREDICTABLE

(4)对应的ARM指令

STR<Rd>,[SP,#<immed_8>*4]

11.5.14字节存储指令STRB(1)

(1)编码格式

字节存储加载指令STRB(1)的编码格式如图11.55所示。

图11.55STRB(1)指令的编码格式

STRB(1)字节数据存储指令用于将一个8位的字节数据写入到指令中指定的内存单元,该字节数据为指令中存放源操作数寄存器的低8位。常用于结构体的数据访问。域的基地址放在Rn寄存器中。

(2)指令的语法格式

STRB<Rd>,[<Rn>,#<immed_5>]

①<Rd>

目的寄存器。

②<Rn>

指令的基址寄存器。

③<immed_5>

5位立即数。用于与<Rn>寄存器中的数值相加,形成内存访问地址。

(3)指令操作的伪代码

address=Rn+immed_5

Memory[address,1]=Rd[7:0]

(4)对应的ARM指令

STRB<Rd>,[<Rn>,#<immed_5>]

11.5.15寄存器存储指令STRB(2)

(1)编码格式

寄存器存储指令STRB(2)的编码格式如图11.56所示。

图11.56STRB(2)指令的编码格式

寄存器存储指令STRB(2)用于将一个8位的字节数据写入到指令中指定的内存单元。此种形式的LDRB指令常被用于访问数组中的元素。

(2)指令的语法格式

STRB<Rd>,[<Rn>,<Rm>]

①<Rd>

目的寄存器。

②<Rn>

此寄存器存放内存访问基地址。

③<Rm>

此寄存器存放内存访问偏移地址。

(3)指令操作的伪代码

address=Rn+Rm

Memory[address,1]=Rd[7:0]

(4)对应的ARM指令

STRB<Rd>,[<Rn>,<Rm>]

11.5.16半字存储指令STRH(1)

(1)编码格式

半字存储加载指令STRH(1)的编码格式如图11.57所示。

图11.57STRH(1)指令的编码格式

STRH(1)半字数据存储指令用于将一个16位的半字数据写入到指令中指定的内存单元,该半字数据为指令中存放源操作数寄存器的低16位。常用于结构体的数据访问。域的基地址放在Rn寄存器中。

(2)指令的语法格式

STRH<Rd>,[<Rn>,#<immed_5>*2]

①<Rd>

目的寄存器。

②<Rn>

指令的基址寄存器。

③<immed_5>

5位立即数。该立即数的2倍与<Rn>寄存器中的数值相加,形成内存访问地址。

(3)指令操作的伪代码

address=Rn+(immed_5*2)

ifaddress[1:0]==0

Memory[address,2]=Rd[15:0]

Else

Memory[address,2]=UNPREDICTABLE

(4)对应的ARM指令

STRH<Rd>,[<Rn>,#<immed_5>*2]

11.5.17寄存器存储指令STRH(2)

(1)编码格式

寄存器存储指令STRH(2)的编码格式如图11.58所示。

图11.58STRH(2)指令的编码格式

寄存器存储指令STRH(2)用于将一个8位的半字数据写入到指令中指定的内存单元。此种形式的STRH指令常被用于访问数组中的元素。

(2)指令的语法格式

STRH<Rd>,[<Rn>,<Rm>]

①<Rd>

目的寄存器。

②<Rn>

存放形成内存访问地址的第一个寄存器。

③<Rm>

存放形成内存访问地址的第二个寄存器。

(3)指令操作的伪代码

address=Rn+Rm

ifaddress[1:0]==0

Memory[address,2]=Rd[15:0]

Else

Memory[address,2]=UNPREDICTABLE

(4)对应的ARM指令

STRH<Rd>,[<Rn>,<Rm>]

11.5.18数据传送指令举例

下面的例子程序综合使用了各种数据传送指令,通过该例可以对Thumb状态下数据传送指令有更深入的了解。

LDRr4,[r2,#4] ;将[r2+4]地址单元字数据加载到寄存器r4

LDRr4,[r2,r1] ;将[r2+r4]地址单元字数据加载到寄存器r4

STRr0,[r7,#0x7c] ;将r0中的字数据存储到[r7+124]的内存地址单元中

STRBr1,[r5,#31] ;将r1的低8位数据存储到[r5+31]的内存地址单元中

STRHr4,[r2,r3] ;将r4的低16位数据存储到[r2+r3]的内存地址单元中

LDRHr3,[r6,r5] ;将[r6+r5]地址单元低16位数据加载到寄存器r3中

LDRBr2,[r1,#5] ;将[r1+5]地址单元低8位数据加载到寄存器r2中

LDRr6,[PC,#0xFC] ;将[PC+0x3FC]地址单元数据加载到寄存器r6中

LDRr5,[SP,#64] ;将[SP+64]地址单元数据加载到寄存器r5中

STRr4,[SP,#0x260] ;将寄存器r4中的数据存储到[SP+0x260]内存地址单元中

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭