AA+3A+2A+1A
DBC82416ABCD0241680
LDR字对齐地址
A+3A+2A+1A
ABCD241680LDR地址偏移2图20:LittleEndian偏移寻址
字存储指令(STR)应该产生一个字对齐地址,如果地址不是字对齐,数据线上的字不会受影响,也就是说,寄存器的第31位通常出现在数据输出的第31位。BigEndian配置
ABCD241680
如果提供的地址为字边界,字节加载(LDRB)希望在总线输入上的数据为31到24,如果地址为字地址加一,总线输入上的数据为23到16,依此类推。选中的字节被放在目标寄存器的低8位,寄存器的其它位用零填充。参考图4。
字节存储(STRB)通过四次重复将源寄存器中的低8位放到数据总线上的0到31。外部的MEM系统应该激活相应的子系统去存储数据。
字加载(LDR)应产生字对齐地址,字边界地址偏移0或2将导致数据被旋转到寄存器,所以寻址的字节占用了寄存器31到24位。这意味着在这些偏移的基础上的半字访问将被正确地加载到寄存器的16到31位。需要移位操作去移动(可选的符号扩展)数据到低16位。字边界地址偏移1或3将导致数据被旋转到寄存器15到8位。
41
This file is generated by AlienTools PDF Generator, unregister version
字存储(STR)将产生字对齐地址。如果不是字对齐地址,总线上的字将不受影响。也就是说,存储在寄存器的位31总是总线上的位31。4.7.4R15的应用
如果R15被指定为基址寄存器(Rn),不会指定回写。当R15被用作基址寄存器,必须记住,它包含了的地址为当前指令地址加上的8字节地址。R15不能作为偏移寄存器(Rm)。
当R15在寄存器存储指令(STR)中作为源寄存器(Rd),存储的值将是指令地址加12。4.7.5基址寄存器的应用限制
当配置过时异常时,下面的代码因为基址寄存器很难解开,在异常处理之前,Rn得到更新,计算初始的值有时是不可能的。例:
LDRR0,[R1],R1
从合法地址传送或者传送到合法地址对存储器管理系统来说都可能产生问题。例如,在一个用虚拟存储器的系统中,所请求的数据对主存储器来讲可能不存在。存储管理器驱动处理器的ABORT输入为高标志此问题,因此,数据异常陷阱产生。直到系统软件解决这个问题,指令被重新执行源程序继续。4.4.7指令周期时序
正常的LDR指令花费1S+1N+1I,LDRPC花费2S+2N+1I周期,S,N,I将在5.1(65)页周期类型中定义。
STR指令花费2N周期。4.7.8汇编语法
42
This file is generated by AlienTools PDF Generator, unregister version
{cond}图8:条件代码
{B}如果有B,则为字节传输,否则为字传输
{T}如果T存在,在后索引指令中W将被置位,强迫传输周期进入非管理模式。当前索引地址
被指定或应用时,T是不允许出现的。Rd是计算寄存器号的表达式。
可以是:(1)产生地址的表达式<表达式>
编译器试图产生一个指令,用PC做基址,以表达式计算结果作为地址,此地址中的数据作为立即数偏移量,是一个PC相关,前索引的地址。如果次地址超出边界,报错。前索引地址规格
[Rn]零偏移
[Rn,<#表达式>]{!}偏移为表达式个字节
[Rn,{+/-}Rm{,
[Rn]<#expression>偏移为表达式个字节
[Rn],{+/-}Rm{,
Rn和Rm是计算寄存器序号的表达式,如果Rn为R15,考虑到ARM7的流水线操作,编译器将从偏移量减去8,在这种情况下,不指定回写。
4.7.9举例
STRR1,[R2,R4]!;存储R1在R2+R4(两个都位寄存器)回写地址到R2
STRR1,[R2],R4;存储R1到R2所包含的有效地址,R2+R4合成的有效地址写入R2LDRR1,[R2,#16];以R2+16为有效地址,此地址中的内容加载到R1,不回写LDRR1,[R2,R3,LSL#2];以R2+R3*4为地址,此地址中的内容加载到R1
LDREQBR1,[R6,#5];以R6+5为地址,有条件地加载此地址中的内容到R1的0到7位,其它
位用0填充STRR1,PLACE;
产生一个PC相关的偏移地址
(2)
(3)
43
This file is generated by AlienTools PDF Generator, unregister version
4.8数据块传输(LDM,STM)
此指令只有当条件为真的时候才会执行。不同的条件在本章开始时已定义。图12显示了指令编码。
数据块传输指令用于加载(LDM)或者存储(STM)当前有效寄存器的任意子集。它们支持所有可能的堆栈模式,维持空或者满的堆栈,此堆栈可以向上或者向下,在保存或者恢复内容,移动主存储器的大数据块是非常有效的。4.8.1寄存器列表
此指令可以导致当前bank中的任意寄存器传输(非用户模式程序可以传送或者接收用户bank)。在指令中,寄存器列表占用了16位,每一位对应了一个寄存器,如果位0为’1’,将导致R0被传输,为’0‘R0将不被传送,以此类推。
寄存器的任意子集或者所有的寄存器都可以被指定,唯一的限制是寄存器列表不应该为空。任何时候R15被存储到MEM中,存储的值是SMT指令地址加12。31282725242322212024Cond100PUSWLRn1615寄存器列表0基址寄存器加载/存储位0=存储到寄存器1=从寄存器加载回写位0=不回写1=回写PSR/强制用户位0=不加载PSR或强制用户模式1=加载PSR或强制用户模式上/下位0=下,基址减去偏移1=上,基址加上偏移前/后向索引位0=后,传输之后加偏移两1=前,传输之前加偏移两条件代码区图21:块数据传输指令
44
This file is generated by AlienTools PDF Generator, unregister version
4.8.2地址模式
传输地址是由Rn中的内容和前/后向索引位,上/下位决定的,寄存器的传输按照从低向高的顺序,如果寄存器列表中有R15,则R15在最后一个被传输。序号低的寄存器对应于存储器的低地址。下面的图例,在Rn=0X1000和需要回写位(W=1)的情况下,R1,R5,R7的传送。图22:后向增加寻址,图23:前向增加寻址,图24:后向减小寻址,图25:前向减小寻址。显示出了指令完成后,寄存器传输顺序,用到的地址,Rn值的变化。
在基址回写位没有被请求(W=0)的情况下,Rn将保持它的初始值0X1000,除非Rn也在多寄存器的指令列表中,被加载的值覆盖。4.8.3地址对齐
地址通常应该是字对齐,但非字对齐的地址不影响指令。地址的低两位将出现在地址线A[1:0],由MEM系统解释。
0X100C
Rn
0X10000XFF4
1
0X100C
R5R10X10000XFF4
3
图22:后向增加地址
4
RnR7R5R12R10X100C0X10000XFF4
0X100C0X10000XFF4
45
This file is generated by AlienTools PDF Generator, unregister version