4.9单次数据交换31Cond2827232200010B21201900Rn1615Rd1211874000010013Rm0源寄存器目标寄存器基址寄存字/字节位0=交换字单位1=交换字节单位条件代码区图26:交换指令
此指令只有条件为真的时候才能执行。不同的条件定义在本章开头已经讲过。指令编码显示在图26:交换指令。
数据交换指令用于在寄存器和外部存储器之间交换字或者字节。此指令执行表现为一个存储器读后面紧跟存储器写,两条指令被锁在一起连续执行(处理器在两个操作完成之前,不能被中断,存储管理器被警告不可将这两条指令分开对待),这种类型的指令是非常有用的,可以用做软件semaphores。
交换的地址由基址寄存器(Rn)中的内容来决定,处理器首先读要交换的地址的内容,然后写源寄存器(Rm)中的内容到交换地址,然后存储原存储器内容到目标寄存器。源寄存器和目标寄存器可能为同一个寄存器。
在读和写操作过程中,LOCK信号输出为高,提醒外部的存储管理器读写操作已经被锁在一起,应该没有中断地完成。在多处理器系统中,这是非常重要的,交换指令是惟一的不可分割指令,可以用于semaphores,存储器的控制权一定不能从正在执行锁操作的处理器上移开。4.9.1字节和字
这种指令可以用于在ARM7寄存器和存储器之间交换字(B=0)或者字节(B=1)。SWP指令执行相当于LDR指令紧跟STR指令,这些指令行为和在单此数据传输部分描述的一样。特别地,BigEndian和LittleEndian的描述同样适用于SWP指令。4.9.2R15的应用
在SWP指令中,R15不能作为操作数使用。
51
This file is generated by AlienTools PDF Generator, unregister version
4.9.3数据异常
如果用于交换的地址对于存储管理系统来讲是不可接受的,内部的MMU或外部的存储管理器将通过驱动ABORT为高来标志这个问题。这可能发生在读,写(读写)周期或其它周期,产生数据异常陷阱。直到系统软件解决这个问题,指令才可以重新执行,源程序继续。4.9.4指令周期
交换指令的执行花费1S+2N+1I个周期,S,N,I在65页5.1部分指令周期类型中介绍。4.9.5汇编语法
如果B存在,则为字节交换,否则,字交换
Rd,Rm,Rn为计算有效寄存器序号的表达式4.9.6例子
SWPR0,R1,[R2];加载R0到R2的有效地址,保存R1在R2有效地址
SWPBR2,R3,[R4];加载R2到R4有效字节地址,存储R3的0到7到R4有效字节地址SWPEQR0,R0,[R1],有条件地将R1有效地址中的内容和R0的值交换
52
This file is generated by AlienTools PDF Generator, unregister version
4.10软件中断Cond注释区(处理器忽略)条件代码区图27:软件中断指令
此指令只有在条件代码为真时执行。不同的条件定义在本章开头已经讲过。图27显示指令编码。
软件中断指令常以一种可控制的方式进入管理模式。此指令导致软件中断陷阱产生,并且影响到模式切换。PC被强制为固定值0X08,CPSR被存到SPSR_svc。如果保护SWI向量地址,禁止用户改变(通过外部的存储管理硬件),可以建立一个全保护的操作系统。4.10.1从管理模式下返回
一旦进入软件中断陷阱,PC被保存到R14_svc,在SWI指令后,调节PC到SWI指令的下一条指令的地址。MOVSPC,R14_svc将返回到调用程序并恢复CPSR。
要注意联接机制不能重复进入,所以如果管理代码自己想用软件中断,它必须首先保存返回的地址和SPSR。4.10.2注释区
指令的低24位被处理器忽略,可以用来同管理代码交换信息。比如,管理员可以检查这个区域并且用它作为执行不同管理功能程序的队列索引。
4.10.3指令周期
软件中断指令执行将花费2S+Nincrementalcycles,S,N将在65页5.1部分说明。4.10.4汇编语法SWI{cond}
条件代码
53
This file is generated by AlienTools PDF Generator, unregister version
4.10.5举例
SWIReadC;从读数据流得到下一个字符
SWIWriteI+”k”;输出一个K”到写数据流SWINE0;条件调用用户模式,注释区域为0
上面的例子加顶相应的超级用户代码存在,例
0x08BSupervisor;SWI入口EntryTable;超级用户程序入口DCDZeroRtnDCDReadCRtnDCDWriteIRtn...
ZeroEQU0ReadCEQU256WriteIEQU512超级用户
SWIhasroutinerequiredinbits8-23anddata(ifany)inbits0-7.假设R13_svc指向一个相应的堆栈
STMFDR13,{R0-R2,R14};保存工作寄存器和返回地址LDRR0,[R14,#-4];得到SWI指令BICR0,R0,#0xFF000000;清除高8位MOVR1,R0,LSR#8;得到程序偏移量
ADRR2,EntryTable;得到入口列表的起始地址LDRR15,[R2,R1,LSL#2];分支到适当的程序
WriteIRtn;enterwithcharacterinR0bits0-7......
LDMFDR13,{R0-R2,R15}^;恢复工作环境并返回
恢复处理器模式和标志位
54
This file is generated by AlienTools PDF Generator, unregister version
4.11协处理器数据操作(CDP)
????μμóé Foxit Reader ±à?-°?è¨??óD ·-°?2?????1??à1à?£
此指令只有在条件代码为真的时候才会执行。本章开头讲过不同条件代码的定义。指令编码在图28中显示,图28:协处理器数据操作指令
此种类型的指令告诉协处理器执行一些内部的操作,没有结果返回到ARM7,ARM7也不会等待指令的完成。协处理器可以包含一个等待指令执行的队列,这些指令的执行可以和ARM7交迭,将花费2S+1Nincrementalcycles,S和N在65页5.1部分说明,允许协处理器和ARM7并行工作,执行相互独立的任务。3128272423201916151211875430Cond1110CPOpcCRnCRdCP#CP0CRm协处理器操作寄存器协处理器信息协处理器序列号协处理器目标寄存器协处理器操作寄存器协处理器操作码条件代码图28:协处理器数据操作指令
4.11.1协处理器区域
只有位4和位24到31对ARM7来讲有意义;余下的位都由协处理器使用。上面的区域定义都是习惯应用,特殊的协处理器可以重新定义所有域的应用,除过CP#。CP#包含一个协处理器的标识符(从0到15),一个协处理器可以忽略任何一条CP#域内不包含它的标识符的指令。
此指令的习惯的解释是协处理器应该执行一个在CPOpc域中指定的操作(也有可能在CP域中),操作数为CRn和CRm中的内容,并将结果放在CRd中。4.11.2指令周期
协处理器数据操作将花费1S+bIincrementalcycles,S和I在65页5.1中介绍。b协处理器busy-waitloop花费的周期数
55
This file is generated by AlienTools PDF Generator, unregister version