0X100C
R1Rn
0X10000XFF4
1
0X100CR5R10X1000R5R13
图23:前向加地址0X100C
Rn
0X1000
R10XFF4
1
0X100C0X1000
R5R10XFF4
3
图24:后向减地址
Rn4R7R5R12
0XFF4R7R5R14
Rn2R7R5R10X100C0X10000XFF4
0X100C0X10000XFF4
0X100C0X10000XFF4
0X100C0X10000XFF4
46
This file is generated by AlienTools PDF Generator, unregister version
0X100C0X1000
0X100C0X1000
Rn0XFF4
1
0X100C0X1000R12
0XFF4
0X100C0X1000
R7R5R14
R5R13
0XFF4Rn0XFF4
图25:前向减地址
4.8.4S位的应用
在LDM/STM指令中,若置位S位,它的含义依据R15是否在传输列表中和指令类型的不同而不同。指令只有在管理模式执行时,S才应该置位。LDMR15在传输列表中,S置位(模式转换)
如果指令是LDM,当R15被加载的同时,SPSR_
被传输的寄存器来自用户bank,而不是从当前模式相应的bank。这对于在进程切换中节省用户状态是非常有用的。当这个状态启动时,将禁止基址回写。R15不在传输列表中,S置位(用户bank传输)
对LDM,STM指令来讲,用户寄存器bank将被传送,而不是当前模式下相应的寄存器bank。这对于在进程切换中节省用户状态是非常有用的。当这个状态启动时,将禁止基址回写。当指令为LDM,必须注意,在下一周期中不要读bank寄存器(在LDM后加入延迟保证安全)。
47
This file is generated by AlienTools PDF Generator, unregister version
4.8.5用R15作为基址
在LDM或STM指令中,R15不能作为基址寄存器。4.8.6寄存器列表包含基址寄存器
当回写被指定,基址在指令执行的第二个周期结束时回写。在STM指令周期,第一个寄存器在第二个周期的开始被写出。包含存储的基址,并且基址作为第一个寄存器被存储的STM指令将存储不变的基址值,而基址在第二或其它顺序时,则存储的是已经修改过的值。如果基址在列表中,LDM指令将覆盖当前基址。4.8.7数据异常
某些合法的地址对存储器管理系统来讲是不可接受的,存储管理器通过将ABORT置高表明一个地址问题。在任何一个加载或者传输多个寄存器的指令中,都可能发生这种情况,如果ARM7用在虚拟存储器系统中,异常必须为可恢复的。STM指令异常
如果一个异常发生在多个寄存器存储指令执行时,ARM7将保持不动直至此指令完成,然后,它进入一个数据异常陷阱。存储管理器应该阻止错误的写存储器操作。如果回写被指定,处理器内部状态的唯一变化是基址的改变,这个改变在指令重试之前必须由软件恢复。LDM指令异常
当ARM7在加载多个寄存器指令时检测到数据异常,它改变指令的操作以保证数据恢复。(1)
当异常产生时,停止正在进行的覆盖寄存器的操作。当前异常加载将不会发生,但是之前有可能产生寄存器覆盖。PC一直是最后一个被写的寄存器,所以将被保留。
(2)如果回写被请求,对于已经修改过的基址来讲,是可以恢复的。这就保证了在基址寄存
器在传输传输列表中或者在异常发生之前被覆盖的可恢复性,。当加载多个寄存器指令完成时,数据异常陷阱产生,系统软件在重新执行指令之前,必须恢复任何基址改变(并解决异常)。
4.8.8指令周期
通常LDM指令花费nS+1N+1Iincremental周期,LDMPC花费(n+1)S+2N+1Iincremental周期,S,N,I在65页第五章周期类型中定义。STM指令花费(n-1)S+2Nincrementalcycles。
n表示需要传输的字数。
48
This file is generated by AlienTools PDF Generator, unregister version
4.8.9汇编语法
Rn计算有效寄存器序号的表达式
{!}如果存在,表示请求回写(W=1),否则,W=0
{^}如果存在,置位S,加载CPSR和PC,在管理模式,强制传送用户bank地址模式命名
对于每一个不同的地址模式有不同的汇编标识方法,依据指令是否用于支持堆栈或者其它用途。不同的指令名称和相应的位的对应关系列于下表:NAME
pre-incrementloadpost-incrementloadpre-decrementloadpost-decrementloadpre-incrementstorepost-incrementstorepre-decrementstorepost-decrementstoreSTACKLDMEDLDMFDLDMEALDMFASTMFASTMEASTMFDSTMEDOTHERLDMIBLDMIALDMDBLDMDASTMIBSTMIASTMDBSTMDALBIT111100000
PBIT10101010
UBIT11001100
地址模式名称
通过参考堆栈请求格式,FD,ED,FA,EA定义了前/后向索引和上/下位,F,E表示堆栈满或者空。A和D定义堆栈是递增还是递减,如果递增,STM将向上,LDM向下,如果递减,则相反。
当LDM/STM没有被用于堆栈,而只是简单地表示地址前向增加,后向增加,前向减少,后向减少时,由IA,IB,DA,DB控制。
49
This file is generated by AlienTools PDF Generator, unregister version
4.8.10举例LDMFDSTMIALDMFDLDMFDSTMFD
SP!,{R0,R1,R2};弹出三个寄存器R0,{R0-R15};保存所有的寄存器
SP!,{R15};R15<-(SP),CPSR不改变
SP!,{R15}^;R15<-(SP),CPSR<-SPSR_mode(优先级模式)R13,{R0-R14}^;在堆栈中保存用户寄存器(优先级模式)
这些指令用于在子程序的入口保存状态,返回调用程序时恢复。
STMEDSP!,{R0-R3,R14};保存R0到R3,使应用程序可以访问;保存R14用于程序返回BLsomewhere;嵌套调用将覆盖R14
LDMEDSP!,{R0-R3,R15};恢复空间并返回
This file is generated by AlienTools PDF Generator, unregister version
50