存储器加载指令不会影响APSR寄存器中的任何标志位。
1.LDR<Rt>,[<Rn>,<Rm>]
该指令从[<Rn>+<Rm>]寄存器所指向存储器的地址中,取出一个字(32位),并将其写到寄存器Rt中,该汇编助记符指令的机器码格式如图4.11所示。从该指令的机器码格式可知,Rm、Rn和Rt所使用寄存器的范围为R0~R7。
图4.11 LDR<Rt>,[<Rn>,<Rm>]指令的机器码格式
指令LDR R0,[R1,R2],其机器码为(5888) 16 。该指令从[R1+R2]所指向存储器的地址中,取出一个字(32位),并将其写到寄存器R0中。
2.LDRH<Rt>,[<Rn>,<Rm>]
该指令从[<Rn>+<Rm>]寄存器所指向存储器的地址中,取出半个字(16位),将其写到寄存器Rt的[15:0]位中,并将寄存器Rt的[31:16]位清零,该汇编助记符指令的机器码格式如图4.12所示。从该指令的机器码格式可知,Rm、Rn和Rt所使用寄存器的范围为R0~R7。
图4.12 LDRH<Rt>,[<Rn>,<Rm>]指令的机器码格式
指令LDRH R0,[R1,R2],其机器码为(5A88) 16 。该指令从[R1+R2]所指向存储器的地址中,取出半个字(16位),将其写到寄存器R0的[15:0]位。
3.LDRB<Rt>,[<Rn>,<Rm>]
该指令从[<Rn>+<Rm>]寄存器所指向存储器的地址中,取出单字节(8位),将其写到寄存器Rt的[7:0]位,并将寄存器Rt的[31:8]位清零,该汇编助记符指令的机器码格式如图4.13所示。从该指令的机器码格式可知,Rm、Rn和Rt所使用寄存器的范围为R0~R7。
图4.13 LDRB<Rt>,[<Rn>,<Rm>]指令的机器码格式
指令LDRB R0,[R1,R2],其机器码为(5C88) 16 。该指令从[R1+R2]寄存器所指向存储器中,取出一个字节(8位),并将其写到寄存器R0的[7:0]位。
4.LDR<Rt>,[<Rn>,#imm]
该指令从[<Rn>+imm]指向存储器的地址中,取出一个字(32位),并将其写到寄存器Rt中,该汇编助记符指令的机器码格式如图4.14所示。从该指令的机器码格式可知,Rn和Rt所使用寄存器的范围为R0~R7。
图4.14 LDR<Rt>,[<Rn>,#imm]指令的机器码格式
注: (1)该汇编语言助记符指令中允许的立即数imm的范围为0~124(7位二进制数),并且该立即数是4的整数倍。在对该立即数imm进行机器指令编码时,将汇编语言助记符指令中给出的立即数imm右移两位,然后得到该汇编指令中立即数在机器码中的编码格式为imm5,即为5位立即数。
(2)汇编语言助记符指令中的立即数imm=0扩展到32位(imm5<<2)。
指令LDR R0,[R1,#0x7C],其机器码为(6FC8) 16 ,该指令从[R1+0x7C]所指向存储器的地址中,取出一个字(32位),并将其写到寄存器R0中。
注: 对于汇编指令中给出的立即数0x7C,在将其转换为机器码格式时,右移2位,变成0x1F,因此机器指令的格式为(6FC8) 16 。
指令LDR R0,[R1,#0x80]中的立即数0x80超过范围,因此该指令是错误的。指令LDR R0,[R1,#0x7E]中的立即数0x7E没有字对齐(不是4的整数倍),因此该指令也是错误的。
5.LDRH<Rt>,[<Rn>,#imm]
该指令从[<Rn>+imm]指向存储器的地址中,取出半个字(16位),并将其写到寄存器Rt的[15:0]位,用零填充[31:16]位。该汇编助记符指令的机器码格式如图4.15所示。从该指令的机器码格式可知,Rn和Rt所使用寄存器的范围为R0~R7。
图4.15 LDRH<Rt>,[<Rn>,#imm]指令的机器码格式
注: (1)该汇编语言助记符指令中允许的立即数imm的范围为0~62(6位二进制数),并且该立即数是2的整数倍。在对该立即数imm进行机器指令编码时,将汇编语言助记符指令中给出的立即数imm右移1位,然后得到该汇编指令中立即数在机器码中的编码格式为imm5,即为5位立即数。
(2)该汇编语言助记符指令中的立即数imm=0扩展到32位(imm5<<1)。
指令LDRH R0,[R1,#0x3E],其机器码为(8FC8) 16 ,该指令从[(R1)+(0x3E)]指向存储器的地址中,取出半个字(16位),并将其写到寄存器R0的[15:0]位,[31:16]位用0填充。
注: 对于汇编指令中给出的立即数0x3E,在将其转换为机器码格式时,右移1位,变成0x1F,因此机器指令的格式为(8FC8) 16 。
指令LDRH R0,[R1,#0x40]中的立即数0x40超过范围,因此该指令是错误的。指令LDRH R0,[R1,#0x3F]中的立即数0x3F没有半字对齐,因此该指令也是错误的。
6.LDRB<Rt>,[<Rn>,#imm]
该指令从[<Rn>+imm]指向存储器的地址中,取出单字节(8位),并将其写到寄存器Rt的[7:0]位,用零填充[31:8]位。该汇编助记符指令的机器码格式如图4.16所示。从该指令的机器码格式可知,Rn和Rt所使用寄存器的范围为R0~R7。
图4.16 LDRB<Rt>,[<Rn>,#imm]指令的机器码格式
注: (1)该汇编语言助记符指令中允许的立即数imm5的范围为0~31(5位二进制数)。
(2)该汇编语言助记符指令中的立即数imm可以删除,表示偏移为0。
指令LDRB R0,[R1,#0x1F],其机器码为(7FC8) 16 ,该指令从[(R1)+0x1F]指向存储器的地址中,取出单字节,并将其写到寄存器Rt的[7:0]位。
7.LDR<Rt>,=立即数
该指令将立即数加载到寄存器Rt中。实际上,当Keil μVision编译器对该指令进行编译处理时,会转换为LDR<Rt>,[pc,#imm]的形式。因此,没有该指令的机器码编码格式,该指令为伪指令。该指令的存在只是方便编程人员直接对存储器空间的绝对地址进行操作而已。
注: 该伪指令生成最有效的单个指令以加载任何32位数。可以使用该伪指令生成超出MOV和MVN指令范围的常量。
指令LDR R0,=0x12345678,将立即数0x12345678的值加载到寄存器R0中。
8.LDR<Rt>,[PC,#imm]
该指令从[PC+imm]指向存储器的地址中,取出一个字,并将其写到寄存器Rt中,该汇编助记符指令的机器码格式如图4.17所示。从该指令的机器码格式可知,Rt所使用寄存器的范围为R0~R7。
图4.17 LDR<Rt>,[PC,#imm]指令的机器码格式
注: (1)该汇编语言助记符指令中允许的立即数imm的范围为0~1020(10位二进制数),并且该立即数是4的整数倍。在对该立即数imm进行机器指令编码时,将汇编语言助记符指令中给出的立即数imm右移2位,然后得到该汇编指令中立即数在机器码中的编码格式为imm8,即为8位立即数。
(2)该汇编语言助记符指令中的立即数imm=0扩展到32位(imm8<<2)。
指令LDR R7,[PC,#0x44],其机器码为(4F11) 16 ,该指令从[(PC)+0x44]指向存储器的地址中,取出一个字,并将其写到寄存器R7中。
注: 对于汇编指令中给出的立即数0x44,在将其转换为机器码格式时,右移2位,变成0x11,因此机器指令的格式为(4F11) 16 。
9.LDR<Rt>,[SP,#imm]
该指令从[SP+imm]指向存储器的地址中,取出一个字,并将其写到寄存器Rt中,该汇编助记符指令的机器码格式如图4.18所示。从该指令的机器码格式可知,Rt所使用寄存器的范围为R0~R7。
图4.18 LDR<Rt>,[SP,#imm]指令的机器码格式
注: (1)该汇编语言助记符指令中允许的立即数imm的范围为0~1020(10位二进制数),并且该立即数是4的整数倍。在对该立即数imm进行机器指令编码时,将汇编语言助记符指令中给出的立即数imm右移2位,然后得到该汇编指令中立即数在机器码中的编码格式为imm8,即为8位立即数。
(2)该汇编语言助记符指令中的立即数imm=0扩展到32位(imm8<<2)。
指令LDR R0,[SP,#0x68],其机器码为(981A) 16 ,该指令从[(SP)+0x68]指向存储器的地址,取出一个字,并将其写到寄存器R0中。
注: 对于汇编指令中给出的立即数0x68,在将其转换为机器码格式时,右移2位,变成0x1A,因此机器指令的格式为(981A) 16 。
10.LDRSH<Rt>,[<Rn>,<Rm>]
该指令从[Rn+Rm]所指向的存储器中取出半个字(16位),并将其写到Rt寄存器的[15:0]位中。对于[31:16]位,取决于第[15]位,采用符号扩展。当该位为1时,[31:16]各位均用1填充;当该位为0时,[31:16]各位均用0填充。该汇编助记符指令的机器码格式如图4.19所示。从该指令的机器码格式可知,Rm、Rn和Rt所使用寄存器的范围为R0~R7。
图4.19 LDRSH<Rt>,[<Rn>,<Rm>]指令的机器码格式
指令LDRSH R0,[R1,R2],其机器码为(5E88) 16 。该指令从[R1+R2]所指向的存储器地址中取出半个字(16位),并将其写到R0寄存器的[15:0]位中,同时进行符号扩展。
11.LDRSB<Rt>,[<Rn>,<Rm>]
从[Rn+Rm]所指向存储器的地址中取出单字节(8位),并将其写到Rt寄存器[7:0]位。对于[31:8]位,取决于第[7]位,采用符号扩展。当该位为1时,[31:8]各位均用1填充;当该位为0时,[31:8]各位均用0填充。该汇编助记符指令的机器码格式如图4.20所示。从该指令的机器码格式可知,Rm、Rn和Rt所使用寄存器的范围为R0~R7。
图4.20 LDRSB<Rt>,[<Rn>,<Rm>]指令的机器码格式
指令LDRSB R0,[R1,R2],其机器码为(5688) 16 。该指令从[R1+R2]所指向的存储器中取出一个字节(8位),并将其写到R0寄存器的[7:0]位,同时进行符号扩展。
思考与练习4.4:说明以下指令实现的功能。
(1)LDR R1,=0x54000000___________________________________
(2)LDRSH R1,[R2,R3]___________________________________
(3)LDR R0,LookUpTable___________________________________
(4)LDR R3,[PC,#100]___________________________________
下面介绍存储器保存指令,并对这些指令进行详细说明。这些指令不影响APSR寄存器中的任何标志位。
1.STR<Rt>,[<Rn>,<Rm>]
该指令将Rt寄存器中的字数据写到[<Rn>+<Rm>]所指向存储器的地址单元中,该汇编助记符指令的机器码格式如图4.21所示。从该指令的机器码格式可知,Rm、Rn和Rt所使用寄存器的范围为R0~R7。
图4.21 STR<Rt>,[<Rn>,<Rm>]指令的机器码格式
指令STR R0,[R1,R2],其机器码为(5088) 16 。该指令将R0寄存器中的字数据写到[R1+R2]所指向存储器地址单元中。
2.STRH<Rt>,[<Rn>,<Rm>]
该指令将Rt寄存器的半字,即[15:0]位写到[<Rn>+<Rm>]所指向存储器的地址单元中,该汇编助记符指令的机器码格式如图4.22所示。从该指令的机器码格式可知,Rm、Rn和Rt所使用寄存器的范围为R0~R7。
图4.22 STRH<Rt>,[<Rn>,<Rm>]指令的机器码格式
指令STRH R0,[R1,R2],其机器码为(5288) 16 。该指令将R0寄存器中的[15:0]位数据写到[R1+R2]所指向存储器的地址单元中。
3.STRB<Rt>,[<Rn>,<Rm>]
该指令将Rt寄存器的字节,即[7:0]位写到[<Rn>+<Rm>]所指向存储器的地址单元中,该汇编助记符指令的机器码格式如图4.23所示。从该指令的机器码格式中可知,Rm、Rn和Rt所使用寄存器的范围为R0~R7。
图4.23 STRB<Rt>,[<Rn>,<Rm>]指令的机器码格式
指令STRB R0,[R1,R2],其机器码为(5488) 16 。该指令将R0寄存器中的[7:0]位写到[R1+R2]所指向存储器的地址单元中。
4.STR<Rt>,[<Rn>,#imm]
该指令将Rt寄存器的字数据写到[<Rn>+imm]所指向存储器地址的单元中。该汇编助记符指令的机器码格式如图4.24所示。从该指令的机器码格式可知,Rn和Rt所使用寄存器的范围为R0~R7。
图4.24 STR<Rt>,[<Rn>,#imm]指令的机器码格式
注: (1)该汇编语言助记符指令中允许的立即数imm的范围为0~124(7位二进制数),并且该立即数是4的整数倍。在对该立即数imm进行机器指令编码时,将汇编语言助记符指令中给出的立即数imm右移2位(零扩展),然后得到该汇编指令中立即数在机器码中的编码格式为imm5,即为5位立即数。
(2)该汇编语言助记符指令中的立即数imm=0扩展到32位(imm5<<2)。
指令STR R0,[R1,#0x44],其机器码为(6448) 16 ,该指令将R0寄存器的字写到[R1+0x44]所指向存储器地址的单元中。
注: 对于汇编指令中给出的立即数0x44,在将其转换为机器码格式时,右移2位,变成0x11,因此机器指令的格式为(6448) 16 。
5.STRH<Rt>,[<Rn>,#imm]
该指令将Rt寄存器的半字数据,即[15:0]位写到[<Rn>+imm]所指向存储器地址的单元中。该汇编助记符指令的机器码格式如图4.25所示。从该指令的机器码格式可知,Rn和Rt所使用寄存器的范围为R0~R7。
图4.25 STRH<Rt>,[<Rn>,#imm]指令的机器码格式
注: (1)该汇编语言助记符指令中允许的立即数imm的范围为0~62(6位二进制数),并且该立即数是2的整数倍。在对该立即数imm进行机器指令编码时,将汇编语言助记符指令中给出的立即数imm右移1位(零扩展),然后得到该汇编指令中立即数在机器码中的编码格式为imm5,即为5位立即数。
(2)该汇编语言助记符指令中的立即数imm=0扩展到32位(imm5<<1)。
指令STRH R0,[R1,#0x2],其机器码为(8048) 16 。该指令将R0寄存器的半字,即[15:0]位写到[R1+0x2]所指向存储器地址的单元中。
注: 对于汇编指令中给出的立即数0x2,在将其转换为机器码格式时,右移1位,变成0x1,因此机器指令的格式为(8048) 16 。
6.STRB<Rt>,[<Rn>,#imm]
该指令将Rt寄存器的字节数据写到[<Rn>+imm]所指向存储器的单元中。该汇编助记符指令的机器码格式如图4.26所示。从该指令的机器码格式可知,Rn和Rt所使用寄存器的范围为R0~R7。
图4.26 STRB<Rt>,[<Rn>,#imm]指令的机器码格式
注: (1)该汇编语言助记符指令中允许的立即数imm的范围为0~31(5位二进制数)。
(2)该汇编语言助记符指令中的立即数imm=0扩展到32位(imm5)。
指令STRB R0,[R1,#0x1],其机器码为(7048) 16 。该指令将R0寄存器的字节[7:0]位写到[R1+0x01]所指向存储器地址的单元中。
7.STR<Rt>,[SP,#imm]
该指令将Rt寄存器中的字数据写到[SP+imm]所指向存储器地址的单元中。该汇编助记符指令的机器码格式如图4.27所示。从该指令的机器码格式可知,Rt所使用寄存器的范围为R0~R7。
图4.27 STR<Rt>,[SP,#imm]指令的机器码格式
注: (1)该汇编语言助记符指令中允许的立即数imm的范围为0~1020(10位二进制数),并且该立即数是4的整数倍。在对该立即数imm进行机器指令编码时,将汇编语言助记符指令中给出的立即数imm右移2位(零扩展),然后得到该汇编指令中立即数在机器码中的编码格式为imm8,即为8位立即数。
(2)该汇编语言助记符指令中的立即数imm=0扩展到32位(imm8<<2)。
指令STR R0,[SP,#0x8],其机器码为(9002) 16 。该指令将R0寄存器的字数据写到[SP+(0x8)]所指向存储器地址的单元中。
注: 对于汇编指令中给出的立即数0x8,在将其转换为机器码格式时,右移2位,变成0x2,因此机器指令的格式为(9002) 16 。
思考与练习4.5:说明以下指令实现的功能。
(1)STR R0,[R5,R1]___________________________________
(2)STR R2,[R0,#const-struc]___________________________________