ARM培训教案提纲_第1页
ARM培训教案提纲_第2页
ARM培训教案提纲_第3页
ARM培训教案提纲_第4页
ARM培训教案提纲_第5页
已阅读5页,还剩124页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

129/129ARM培训讲义提纲单位:西安电子科技大学编写:何方勇编写日期:2005年7月1日绪言本次ARM培训主要使各位受训人员了解嵌入式操作系统的基本概念、软硬件构成框架、以及掌握与嵌入式操作系统相关的知识。随着通信技术、电子技术、计算机技术、以及微电子技术的发展,片上系统(SOC)成为当今电子技术的一大主流;这就使得嵌入式开发技术成为整个业界的研究和开发的热点。我们知道当今世界通信与信息技术发展的3大热点是:第三、四代移动通信技术、数字电视技术、以及汽车电子技术。在这几个热点技术的最终实现将被纳入系统的概念,其中嵌入式系统将在里面伴有重要的角色。嵌入式操作系统嵌入式操作系统作为一种新的系统,我们应该怎么把握呢?以下我们将简要介绍一下嵌入式系统。嵌入式操作系统的基本概念从字面上,我们可以从两方面理解嵌入式系统:嵌入式、系统。列举适当的例子说明嵌入式系统的应用:手持设备、大型通信设备嵌入式操作系统与常见的单片机、DSP系统的细微区别从系统的概念出发讲解:单片机、和DSP是没有系统概念的嵌入式操作系统的软硬件平台开发1.嵌入式操作系统的硬件构成:核心处理器、程序和数据存储器、总线系统、外围接口(设备)等;2.嵌入式操作系统的软件构成:系统软件、API、底层驱动、应用程序等结合微机系统操作系统讲解3.常见嵌入式操作系统:VxWorks、PSOS、LINUX、WINCE、NUCLEUS等,各种操作系统的区别和优点及应用前景。怎样进行嵌入式系统设计嵌入式系统开发是本次培训的主要内容,那我们应该从以下方面入手:处理器、硬件部件、操作系统、编程语言、软件开发工具、硬件开发平台、软件组成。处理器:速度、IO设计指标、处理器的软件支持、处理器调试方式、处理器提供商的信誉度;硬件部件:硬件实现难度、开发周期、市场前景、供货情况操作系统:产品的适合度、调试难度、代码结构、可开发潜力、移植可行性编程语言:高级语言、低级语言软件开发工具:系统调试功能如何、支持的库函数、开发商的软件支持嵌入式处理器在以上的讲义中我们简要提到了嵌入式开发的各方面的问题,接下来我们将从硬件开始讲解。在嵌入式系统中,主要以ARM芯片作为该系统的核心芯片。嵌入式处理器简介ARM是AdvancedRISCMachines的缩写,ARM公司于1990成立,ARM以低成本、低功耗、高性能迅速占领了全球市场。其产品广泛应用到移动通信、消费电子、以及嵌入式市场。ARM公司不生产芯片,只是IP供应商,只做设计。常见ARM处理器系列有:ARM7系列、ARM9系列、ARM9E系列、ARM10系列、SecurCoreSC100、StrongARM、XScale。在此,我们主要讲解ARM7系列、ARM9系列:ARM7系列:0.9MIPS/MHz3级流水、冯.诺依曼结构;其内核主要有ARM7TDMI和ARM720T;T:支持16位THUMB指令,D支持在片调试,M增强型乘法器,产生全64位结果,I:嵌入式ICE硬件提供片上断点和调试点支持ARM9系列:1.1MIPS/MHz5级流水、哈佛结构;其内核主要有ARM920T、ARM722T和ARM940T;基于ARM内核的芯片扩展由于ARM公司只做IP,不生产具体的芯片;所以我们所使用的ARM芯片都是全世界其他硬件芯片厂商在经过ARM公司的授权,然后在此基础上进行硬件扩展,以满足不同领域的需求。ARM9系列是当今嵌入式系统应用的主流芯片内核技术。全世界各大厂商都采用ARM公司的IP来开发自己的ARM芯片,主要厂商有:三星、AD、TI、菲利普、Intel、CIRRUSLOGIC等。下面,我们以三星公司的ARM芯片S3C2410X为例来简要介绍基于ARM内核的芯片扩展。注意:ARM9系列是兼容ARM7系列的。ARM920T内核详解现在基于ARM920T内核的芯片逐渐成为嵌入式系统芯片的主流,我们有必要详解其结构;这是进一步学习软件开发的基础。内核的结构图如下所示:下面我们将重点介绍ARM920T的协处理器CP15和内存管理单元MMU协处理器CP15内存管理单元MMU软件开发嵌入式系统的软件开发包括:操作系统和应用程序开发两个方面。下面我们进一步讲解基于ARM芯片的汇编语言。ARM编程模型ARM常见版本是V4和V5,现在主要用的是V4,处理器工作状态:ARM,THUMB开关状态:进入THUMB状态、进入ARM状态存储器格式:大小端点格式指令长度:32位、16位数据类型:字,半字,字节操作模式:7种寄存器:31个通用寄存器和6个状态寄存器中断:ARM基本寻址方式寄存器寻址:立即寻址:寄存器移位寻址:寄存器间接寻址:变址寻址:多寄存器寻址:堆栈寻址:块拷贝寻址:相对寻址:ARM指令集本章内容是详细讲解ARM指令集。ARM指令格式指令集格式:ARM指令集格式如下表4-1所示:表4-1:ARM指令集格式注意:某些指令码没有定义,但并不导致未定义指令陷阱出现,例如一个乘法指令的第6位变为1。不应使用这些指令,因为它们的作用也许会由未来的ARM执行ARM指令集表:下面表4-2、表4-3列出了ARM指令集:表4-2:表4-2:ARM指令集表4-3:表4-3:ARM指令集条件码:在ARM状态下,所有指令都会根据CPSR条件码和指令条件域的状态被有条件地执行。该域(位31:28)决定了执行一条指令的环境。如果C、N、Z和V标志的状态满足该域的编码条件,指令就被执行,否则不予执行。存在着16个可能条件,每种由复加在指令记忆符后的一个双字符后缀表示。例如,Branch(B为汇编语言)变为BEQ表示“BranchifEqual”,意思是当Z标志被置位时执行Branch指令。实际上,表3-2中所列的15个不同的条件也许会用到,第16个(1111)保留,不能使用。在后缀缺省时,大多数指令的条件域被设置成“Always”(后缀AL)。这意味着不管CPSR的条件码是什么,指令永远被执行。下表4-4给出了条件码概况:表4-4:ARM指令中的条件码ARM指令集详解★★1分支与交换(BX指令,Branch和Exchange指令):该指令仅仅在条件为真时被执行,参见表4-4。该指令通过将一个通用寄存器Rn的内容复制到程序计数器PC来执行一个分支。这个分支会引起管道流,并会根据Rn指定的地址再入。该指令也允许交换指令集。当执行该指令时,Rn[0]的值决定了是否按照ARM指令还是THUMB指令对指令流进行解码。指令格式如下图4-1所示:图4-1:BX指令格式★指令循环时间:执行BX指令占用2S+1N周期(与BL一样),这里S和N分别代表连续(S周期)和非连续(N周期)。★汇编程序语法:BX-分支和交换指令BX{cond}Rn;{cond}为双字母条件记忆符(即条件码),见表4-4,而Rn表示一个有效寄存器(比如:R0)★使用R15作操作数:如果将R15作操作数,该情况未定义。例:ADR R0,Into_THUMB+1 ;产生分支目标地址,bit0置位,进入THUMB状态BX R0 ;分支并改变到THUMB状,R15(PC):=R0CODE16 ;汇编作为THUMB指令的后续码Into_THUMBADRR5,Back_to_ARM ;产生分支目标到字排列地址,bit0置低,变回到ARMBX R5 ;分支并变回到ARM状态,R15(PC):=R0ALIGN ;字排列CODE32 ;汇编作为ARM指令的后续码Back_to_ARM★★2分支与带链接分支(B、BL)该指令仅仅在条件为真时被执行,参见表4-4。该指令的编码如下图4-2所示。图4-2:B、BL指令格式分支指令包含有一个有符号的2态补充24位偏移(相当于25根地址线+符号位,即+/-32M字节)。这被左移两位,符号扩展至32位,并加到程序计数器PC。因此该指令可以指定+/-32M字节的分支。该指令偏置必须考虑预取操作,它会引起程序计数器PC超前当前指令2个字(8个字节)。超过+/-32M字节的分支必须使用偏置或事先装入寄存器的绝对目标。在这种情况下,如果要求有带链接类型的分支操作,应当将PC值人工存入R14。★链接位:带链接的分支(BL)将旧的PC写入当前存储空间的链接寄存器(R14)。写入R14的值被调整到允许预取,并包含紧跟着“分支与链接指令”的指令地址。注意CPSR不保留PC值,R14[1:0]总是清零。从带链接的分支返回,如果链接寄存器仍然有效,可使用MOVPC,R14;或如果链接寄存器以被Rn存作堆栈指针,使用LDMRn!,{..PC}。★指令循环时间:分支和带链接分支指令占用2S+1N增加的周期(与BX一样),这里S和N分别代表连续(S周期)和内部(I周期)。★汇编程序语法:{}中的内容任意,<>中的内容必须出现B{L}{cond}<expression>{L}常用请求带链接分支的指令形式。如果缺省,R14不受指令影响,即不将旧的PC值存入R14。{cond} 如表4-4中所示的双字母助记符(条件码),如果缺省,默认为AL(Always)。<expression> 目标单元,汇编程序计算偏移量。例hereBALhere;等待,指令汇编成0xEAFFFFFEB there ;等待,默认条件是“Always”CMP R1,#0 ;R1=0?比较BEQ fred ;为零,则跳转;反之,继续下一个指令BL sub+ROM ;跳转,调用子程序ADDS R1,#1 ;R1=R1+1,设置CPSR标志BLCC sub ;C=0,调用子程序★★3数据处理:数据处理指令仅在条件为真时被执行,参见表4-4。该指令编码如下图4-3所示。图4-3:数据处理指令该指令通过对一或两个操作数进行指定的算术或逻辑运算产生结果。第一个操作数总是一个寄存器(Rn)。根据指令中L(即D25)位的值,第二个操作数可能是一个移位寄存器(Rm)或一个8位循环立即数(Imm)。根据指令中S位的值,确定该指令的结果是否可以保护或更新CPSR中的条件码。确定的运算(TST(OP1与OP2)、TEQ(OP1异或OP2)、CMP(OP1-OP2)、CMN(OP1+OP2))不将结果写入Rd。它们只用执行检测和设置结果中的条件码并总对S位置位。★CPSR标志:数据处理运算可分为逻辑运算和算术运算,逻辑运算(AND、EOR、TST、TEQ、ORR、MOV、BIC、MVN)对操作数的所有相应位或产生结果的操作数执行逻辑运算。如果S位被置位(并且Rd不是R15,见下表),则CPSR中的V标志不受影响,C标志将被置位来执行barrelshifter(或当移位操作为LSL#0时保护),Z标志当且仅当结果全零时被置位,N被置为结果bit31的逻辑值。ARM数据处理指令见下表4-5表4-5:数据处理指令算术运算(SUB、RSB、ADD、ADC、SBC、RSC、CMN)将每个操作数都看作是一个32位的整数(无符号或两个独立的符号,两种情况时一样的)。如果S位被置位(并且Rd不是R15),则CPSR中的V标志在结果的bit31出现溢出时被置位,如果操作数均为无符号数可以不理会,但如果操作数为两个独立的有符号数则会发出错误提示,C标志会由于执行ALU的bit31被置位,Z标志当且仅当结果全零时被置位,N标志被置为结果bit31的值(如果认为操作数为两个独立的有符号数时指示结果为负)。★移位:当第二个操作数被指定为移位寄存器时,寄存器的移位操作受指令中的移位域控制。该域指示要执行的移位类型(逻辑左移或右移、算术右移或循环右移)。寄存器要移动的值可包含在指令的立即域中,或者在另一个寄存器(除了R15)。不同移位类型的编码如图4-4所示。图4-4:ARM移位操作★指定偏移量指令:当指令中指定了偏移量时,它包含了一个5位的区域,其赋值范围为0~31。逻辑左移(LSL)获取Rm的内容并将每一位移动指定量到更有意义的位置。结果的最不重要位以零填充,Rm的最高位被丢弃,并不映射到结果中,除非当ALU运算处于逻辑状态(见上面)时,丢弃的最不重要的位变为shifter的进位输出,并可能锁定CPSR的S位。例如,LSL#5的影响如下图4-5所示。图4-5:逻辑左移注意:LSL#5是一个特例,这里shifter进位输出是CPSRC标志的过去值。Rm的内容被直接用作第二个操作数。逻辑右移(LSR)指令类似,但是Rm的内容被移到结果最不重要的位置。LSR#5的影响如下图4-6所示。图4-6:逻辑右移此种移位使得Rm的第31位有零进位输出。与逻辑左移零一样,逻辑右移零是多余的,所以汇编程序将LSR#0(以及ASR#0和ROR#0)转换成LSL#0,并允许指定LSR#32。算术右移(ASR)与逻辑右移类似,不同的是高位被Rm的bit31填充而不是零。这保护了2个独立符号状态中的符号,例如,ASR#5如下图4-7所示。图4-7:算术右移此种移位使得Rm的bit31重新用作进位输出,并且操作数2的每一位也等于Rm的bit31。所以根据Rm的bit31的值,结果为全1或全0。循环右移(ROR)操作是将逻辑右移操作中移出去的位再引入放置在结果的高端,在逻辑右移中常用零来填充高位。例如,ROR#5如下图4-8所示。图4-8:循环右移期望给ROR#0的移位域形式用于对barrelshifter的特殊功能,即带扩展的循环右移编码。这个循环右移是它使用附加的CPSR的C标志来提供一个要被移位的33位的数量到Rm内容的最高端,参见下图4-9。图4-9:带扩展循环右移★指定偏移量寄存器只有Rs的最低端字节被用来确定偏移量。Rs可以是除R15外的任何寄存器。如果该字节为零,Rm未改变的内容将被当作第二操作数,并且旧的CPSR的C标志值将会被作为shifter的进位输出。如果1到31位之间字节有值,移位结果将与指定移位指令的同一个值和移位操作匹配。如果字节中的值大于等于32,结果为上面所述移位的逻辑扩展:LSL32结果为零,进位输出等于Rm的0位;LSL大于32结果为零,进位为零;LSR32结果为零,进位输出等于Rm的31位;LSR大于32结果为零,进位为零;ASR大于等于32结果和进位等于Rm的31位;ROR32结果等于Rm,进位等于Rm的31位;RORn结果和进位与RORn-32相同,这里n大于32;因此不断从n中减去32,直到n值在1~31之间,见前面。注意:必须使带有控制移位寄存器指令的bit7为零,该位为1会引起指令为乘或未定义。★立即数循环:立即数循环域是一个4位无符号整数,指定对8位立即数进行移位操作。该值为扩展到32位的零,然后通过在循环域中的两倍值服从右移。这可以产生许多常数,例如2的幂。★写入R15当Rd为除R15外的寄存器时,CPSR中的条件码标志可以从前面所述的ALU标志更新。当Rd为R15并且指令中的S标志未置位时,操作结果被放入R15且CPSR不受影响。当Rd为R15且S标志置位时,操作结果被放入R15,对应于当前模式的SPSR被移入CPSR。这允许自动存储PC和CPSR的状态改变。这种指令格式在用户模式下不能使用。★用R15作操作数如果R15(PC)被用于数据处理指令中的一个操作数,可直接使用该寄存器。PC值就是指令地址、加上由于指令预取的8或12个字节。如果指令中指定了移位量,PC为前8个字节。如果用寄存器指定移位量,则PC为前12个字节。★TEQ、TST、CMP和CMN操作码:注意:TEQ、TST、CMP和CMN不写结果操作结果但置位CPSR中的标志位。即使助记符中没有指定,汇编程序也应当总将这些指令的S标志置位。不能使用TEQP指令,它是早期ARM处理器使用的TEQ指令:代替PSR转移操作。在ARM920T中TEQP的功能是:如果处理器工作在特许模式就将SPSR_<mode>移入CPSR,如果在用户模式什么也不做。指令周期:数据处理指令增加的周期数如下表4-6:表4-6:增加的循环时间注:S、N和I分别定义为顺序(S-周期)、非顺序(N-周期)和内部(I-周期)。汇编程序句法 MOV,MVN(单操作数指令).<opcode>{cond}{S}Rd,<Op2> CMP,CMN,TEQ,TST(无结果指令).<opcode>{cond}Rn,<Op2> AND,EOR,SUB,RSB,ADD,ADC,SBC,RSC,ORR,BIC<opcode>{cond}{S}Rd,Rn,<Op2>这里:<Op2> Rm{,<shift>}或,<#expression>{cond} 双字母条件助记符,见表4-4{S} 如果S表示(指CMP,CMN,TEQ,TST),置位条件码.Rd,Rn和Rm 寄存器号表达式<#expression> 如果使用,汇编程序将会产生一个移位的立即8位域来匹配表达式,如果不用会出错<shift> <Shiftname><register>或<shiftname>#expression,或RRX(带扩展右移1位).<shiftname>s ASL,LSL,LSR,ASR,ROR.(ASL与LSL意义相同,它们的汇编码一样)例:ADDEQ R2,R4,R5 ;如果Z标志置位,使R2=R4+R5TEQS R4,#3 ;测试R4等于3(S是多余的,由汇编程序自动插入)SUB R4,R5,R7,LSRR2 ;通过R2底部字节数逻辑右移R7,从R5中减去结果,并;将答案放入R4MOV PC,R14 ;从子程序返回MOVS PC,R14 ;从中断返回,并从SPSR方式保存CPSR★★4PSR转移(MRS、MSR):该指令仅当条件为真时执行,参见表4-4。MRS和MSR指令来自于数据处理操作的子集,并用TEQ、TST、CMN和CMP指令执行,不置位S标志,编码参见下图4-10。这些指令允许对CPSR和SPSR寄存器存取。MRS指令允许将CPSR或SPSR_<mode>的内容移入通用寄存器。MSR指令允许将通用寄存器的内容移入CPSR或SPSR_<mode>寄存器。MSR指令也允许将一个立即数或寄存器内容转移到CPSR或SPSR_<mode>寄存器的条件码标志(N、Z、C和V)而不改变控制位。在这种情况下,指定的寄存器内容的高4位或32位立即数被写入相应PSR(程序状态寄存器)的高4位。★操作数限制:在用户模式,CPSR的控制位受保护,所以只有CPSR的条件码标志可以改变。在其它(特许)模式,整个CPSR均可改变。软件决不能改变CPSR中T位的状态。如果出现这种情况,处理器将进入无法预料的状态。存取的SPSR寄存器取决于执行时的方式。例如,当处理器在FIQ模式时,只有SPSR_fiq是可存取的。不能将R15指定为源或目的寄存器。在用户模式下不能存取SPSR,因为该寄存器不存在(用户不能使用)。图4-10:MRS、MSR指令格式保留位:ARM920T中只定义了PSR的12个位(N、Z、C、V、I、F、T和M[4:0]),其余位保留为将来的处理器使用。为确保ARM920T和将来处理器之间的最大兼容性,应当遵守下列原则:当改变PSR的值时,应当保护保留位;当检查PSR状态时,程序不应当依赖保留位的特定值,因为将来的处理器可能会将它们认作1或0。例:下列顺序完成模式改变:MRS R0,CPSR ;复制CPSRBIC R0,R0,#0x1F ;模式位清零,即将CPSR.M[4:0]清零ORR R0,R0,#new_mode ;选择新模式MSR CPSR,R0 ;回写修改后的CPSR当目的只是简单地改变PSR中的条件方式码时,可直接将值写入标志位而不必影响控制位。下列指令对N、Z、C和V标志置位:MSRCPSR_flg,#0xF0000000 ;对所有标志位置位,不考虑它们的过去状态(不影响控制位)不要试图向整个PSR写入8位立即数,因为这种操作不保护保留位。★指令循环周期:PSR转移占用1S增加的周期,这里S定义为顺序(S-周期)。汇编语言句法:MRS–将PSR内容转移到寄存器MRS{cond}Rd,<psr>MSR–将寄存器内容转移到PSRMSR{cond}<psr>,RmMSR–只将寄存器内容转移到PSR标志位MSR{cond}<psrf>,Rm寄存器内容最重要的4位分别写入N、Z、C和V标志。MSR–只将立即数转移到PSR标志位MSR{cond}<psrf>,<#expression>应当用符号表示分别写入N、Z、C和V标志的最重要4位的32位数值。★关键:{cond} 双字母条件助记符,见表4-4RdandRm 除R15外的寄存器表达式<psr> CPSR,CPSR_all,SPSR或SPSR_all.(CPSR和CPSR_all与SPSR和SPSR_all意义相同)<psrf> CPSR_flg或SPSR_flg<#expression> 如果使用,汇编程序将会产生一个移位的立即8位域来匹配表达式,如果不用会出错例:在用户模式,指令表现为:MSR CPSR_all,Rm ;CPSR[31:28]<-Rm[31:28]MSR CPSR_flg,Rm ;CPSR[31:28]<-Rm[31:28]MSR CPSR_flg,#0xA0000000;CPSR[31:28]<-0xA(setN,C;clearZ,V)MRS Rd,CPSR ;Rd[31:0]<-CPSR[31:0]在特许模式,指令表现为:MSR CPSR_all,Rm ;CPSR[31:0]<-Rm[31:0]MSR CPSR_flg,Rm ;CPSR[31:28]<-Rm[31:28]MSRCPSR_flg,#0x50000000 ;CPSR[31:28]<-0x5(setZ,V;clearN,C)MSRSPSR_all,Rm ;SPSR_<mode>[31:0]<-Rm[31:0]MSRSPSR_flg,Rm ;SPSR_<mode>[31:28]<-Rm[31:28]MSRSPSR_flg,#0xC0000000 ;SPSR_<mode>[31:28]<-0xC(setN,Z;clearC,V)MRSRd,SPSR ;Rd[31:0]<-SPSR_<mode>[31:0]★★5乘和带累加的乘(MUL、MLA):该指令仅当条件为真时执行,参见表4-4。指令编码见下图4-11。乘和带累加的乘指令使用8位布氏运算法则执行整形乘法。图4-11:MUL、MLA指令格式指令的乘法形式为Rd:=Rm*Rs,Rn不考虑,并被设置为零,以兼容将来可能升级的指令集。带累加的乘法形式为Rd:=Rm*Rs+Rn,保存了在某些环境下的一个外在ADD指令。两种指令形式均以有符号(两种独立)或无符号整数作操作数工作。32位有符号乘法和无符号乘法的结果仅在高32位不同,低32位结果是一样的。这些指令进产生乘法的低32位,既可用于有符号乘法,也可用于无符号乘法。例如操作数A 操作数B 结果0xFFFFFFF6 0x00000014 0xFFFFFF381)如果操作数被当作有符号的操作数A为-10,操作数B为20,结果-200被正确地表示为0xFFFFFF38。2)如果操作数被当作无符号的操作数A为4294967286,操作数B为20,结果为85899345720,即0x13FFFFFF38,所以最低32位为0xFFFFFF38。★操作数限制:目标寄存器Rd不一定与操作数寄存器Rm一样。R15必须不能被当作操作数或目标寄存器。所有其它寄存器的组合都会给出正确结果,当需要时Rd、Rn和Rs可用作同一个寄存器。★CPSR标志:可任意置位CPSR的标志位,它由指令中S位控制。N(负)和Z(零)标志根据结果正确置位(N等于结果的bit31位,Z当且仅当结果为零时置位)。C(进位)标志置位无意义的值V(溢出)标志不受影响。★指令循环周期MUL指令占用1S+mI周期,MLA指令占用1S+(m+1)I周期,这里S和I分别代表连续(S周期)和内部(I周期)。m 执行乘法所需的8位乘数阵列周期数,由Rs指定的乘数操作数控制。其可能值如下:如果乘数操作数[32:8]位为全0或全1如果乘数操作数[32:16]位为全0或全1如果乘数操作数[32:24]位为全0或全1所有其它情况★汇编语言句法MUL{cond}{S}Rd,Rm,RsMLA{cond}{S}Rd,Rm,Rs,Rn{cond} 双字母条件助记符,见表4-4{S} 如果S出现,置位条件码Rd,Rm,RsandRn 除R15外的寄存器表达式例:MUL R1,R2,R3 ;R1:=R2*R3MLAEQS R1,R2,R3,R4 ;ConditionallyR1:=R2*R3+R4,Settingconditioncodes.★★6长乘和带累加的长乘(MULL、MLAL)该指令仅当条件为真时执行,参见表4-4。指令编码见下图4-12。长乘指令执行两个32位操作数整数乘法,并产生64位结果。有符号和无符号乘法带可选的累加给出4种变化。图4-12:MULL、MLAL指令格式乘法形式(UMULL和SMULL)占用两个32位数,相乘后得出形式为RdHi,RdLo:=Rm*Rs的结果。64位结果的低32位写入RdLo,结果的高32位写入RdHi。带累加乘法形式(UMLAL和SMLAL)占用两个32位数,相乘后再加一个64位数得出形式为RdHi,RdLo:=Rm*Rs+RdHi,RdLo的结果。64位加数的低32从RdLo读取,64位加数的高32从RdHi读取,64位结果的低32位写入RdLo,结果的高32位写入RdHi。★操作数限制R15不能用作操作数或目标寄存器。RdHi、RdLo和Rm必须指定不同的寄存器。★CPSR标志对CPSR中的标志置位是任意的,并受指令中S位控制。N和Z标志根据结果来置位(N为结果的bit63,Z被置位当且仅当全部64位为0时)。C和V置为无意义的值。★指令循环周期MULL占用1S+(m+1)I周期,MLAL占用1S+(m+2)周期,这里m是执行乘法所需的8位乘数阵列周期数,由Rs指定的乘数操作数控制。其可能值如下:对有符号指令SMULL、SMLAL如果乘数操作数[31:8]位为全0或全1如果乘数操作数[31:16]位为全0或全1如果乘数操作数[31:24]位为全0或全1所有其它情况对无符号指令UMULL、UMLAL如果乘数操作数[31:8]位为全0或全1如果乘数操作数[31:16]位为全0或全1如果乘数操作数[31:24]位为全0或全1所有其它情况S和I分别代表连续(S周期)和内部(I周期)。汇编句法表4-7.汇编程序句法描述这里:{cond} 双字母条件助记符,见表4-4{S} 如果S出现,置位条件码RdLo,RdHi,Rm,Rs 除R15外的寄存器表达式例UMULL R1,R4,R2,R3 ;R4,R1:=R2*R3UMLALS R1,R5,R2,R3 ;R5,R1:=R2*R3+R5★★7单数据转移:该指令仅当条件为真时执行参见表4-4。指令编码见下图4-13。单数据传输指令用于装载或存储单字节数据或字数据。用于传输的“存储器地址”是由增加或减少一个基址寄存器的偏移量而得到的。如果需要自动索引,则该计算结果可以被回写到这个基址寄存器。图4-13:单数据转移指令★偏移量和自动索引在指令中,基址寄存器的偏移量既可以是12bit的无符号立即数,也可以是一个第二寄存器(可能被移位)。当U=1时基址寄存器Rn加上偏移量,而U=0时基址寄存器Rn减去偏移量。偏移量的修改可以在基址寄存器被用于传输地址之前(前索引P=1)或之后(后索引P=0)关于寻址方式是增加还是减少模式,指令的W位(即D21)给出了可选项。当W=1时,修改的基址寄存器值可以回写到基址寄存器中;而当W=0时,基址寄存器值不变。在前索引的寻址方式的情况下,既然通过设置偏移量为零而使旧的基址寄存器值得以保留,那么W位是多余的,并且总被设置为0。因此前索引数据传输总是回写到已经修改的基址寄存器。在后索引数据传输中W位的唯一用处是在特权模式编码中,其中设置W位使得在非特权模式下传输数据,允许操作系统在系统中产生一个用户地址,这样存储器管理硬件将会获得硬件的更好应用。★移位寄存器偏移量8个移位控制位已在数据处理指令一节中介绍过。但移位量指定的寄存器在本指令级别中是无效的,见图4-4。★字节和字:该指令级别可用于在ARM920T寄存器和存储器之间转移一个字节(B=1)或一个字(B=0)。LDR(B)和STR(B)指令的功能受ARM920T内核BIGEND控制信号的影响。两种可能的结果叙述如下。★Little-Endian配置如果提供的地址是以字为边界,则LDRB指期望数据总线上装入的数据是7~0这样的一个字节数据,如果一个字地址加1,则通过数据总线上装入15~8,以此类推。这个被选字节被放入目标寄存器的底部8个位,并以0填充寄存器的其余位。参见图2-2。一个字节存储(STRB)是通过数据总线输出31~0将源寄存器底部8个位重复4次。外部存储器系统应当激活适当字节子系统来存储数据。一个字装入(LDR)通常使用一个字排列地址。但一个字边界的地址偏置会引起数据被循环进入寄存器,所以地址字节占用0~7位。这意味着来自字边界偏置0~2存取的半字将会被正确存入寄存器的0~15位。然后需要两个移位操作来清除或增加符号扩展到高16位。一个字存储(STR)应产生一个字排列地址。如果地址不是字排列的,则出现在数据总线上的字不受影响,即存储到寄存器的bit31总是出现在数据总线的bit31。图4-14.Little-Endian偏移寻址★Big-Endian配置:如果提供给地址的是以字为边界,则希望是通过数据总线输入31~24装入(LDRB)一个字节数据,如果一个字地址加上一个字节则通过数据总线输入23~16装入,以此类推。这个被选字节被放入目标寄存器的底部8个位,并以0填充寄存器的其余位。参见图2-1。一个字节存储(STRB)是通过数据总线输出31~0将源寄存器底部8个位重复4次。外部存储器系统应当激活适当字节子系统来存储数据。一个字装入(LDR)通常使用一个字排列地址。但一个字边界0或2的地址偏置会引起数据被循环进入寄存器,所以偏置地址字节占用31~24位。这意味着这些偏置存取的半字将会被正确存入寄存器的16~31位。然后需要一次移位操作将数据(任意扩展符号)移入低16位。一个字边界1或3的地址偏置会引起数据被循环进入寄存器,所以地址字节占用15~8位。一个字存储(STR)应产生一个字排列地址。如果地址不是字排列的,则出现在数据总线上的字不受影响,即存储到寄存器的bit31总是出现在数据总线的bit31。★R15的使用:如果将R15指定为基本寄存器(Rn)则不必指定回写。当用R15左基本寄存器时,必须记住它包含一个来自当前指令地址的8字节地址。不能将R15用作寄存器偏置(Rm)。当R15为寄存器存储指令(STR)的源寄存器(Rd)时,存储的值为指令地址加12。使用基本寄存器的约束:1)当配置迟的中止时,下面的例子代码很难作为基本寄存器Rn展开,并在中止处理程序开始之前得到更新,有时无法计算初始值。2)中止后,下面的例子代码很难作为基本寄存器Rn展开,并在中止处理程序开始之前得到更新,有时无法计算初始值。例:LDR R0,[R1],R1所以不能使用后寻址的LDR或STR指令,这里Rm是与Rn一样的寄存器。★数据中止:对存储器管理系统而言,对合法地址的转移也可能出现问题。例如,使用虚拟内存的系统中也许没有主内存。内存管理器通过将处理器ABORT输入变高发出信号,这就出现了数据中止陷阱。直到系统软件解决这个问题,然后指令重新开始执行原程序。★指令周期:正常的LDR指令占用1S+1N+1I周期,LDRPC占用2S+2N+1I周期,这里,S、N和I分别定义为顺序(S-周期)、非顺序(N-周期)和内部(I-周期)。STR指令占用2N执行周期。★汇编程序句法:<LDR|STR>{cond}{B}{T}Rd,<Address>这里:LDR 从存储器调入寄存器STR 从寄存器存入存储器{cond} 双字母助记符,见表4-4{B} 如果出现B则字节转移,其余字转移{T} 如果出现T则置位后索引寻址指令中的W位,强制转移周期非特许模式。当指定或隐含前索引寻址模式时不允许使用TRd 表示有效寄存器号RnandRm 表示寄存器号。如果Rn为R15,那么汇编程序从ARM920T流程的偏置值减8。这种情况下不应指定基本回写。<Address>可以是:表示产生一个地址:汇编程序将会产生一条指令,该指令以PC为基础和有表达给出的校正后的直接偏置地址。这是一个相对的、预寻址地址PC。如果地址超出范围,给出出错信息。2 预索引寻址:[Rn] 零偏置[Rn,<#expression>]{!} <expression>字节偏置[Rn,{+/-}Rm{,<shift>}]{!} 变址寄存器+/-偏置,由<shift>移位3 后索引寻址:[Rn],<#expression> <expression>字节偏置[Rn],{+/-}Rm{,<shift>} 变址寄存器+/-偏置,由<shift>移位<shift> 一般移位操作(见数据处理指令),但不能由寄存器指定移位量{!} 如果出现!写回基本寄存器(见W位)例:STR R1,[R2,R4]! ;在R2+R4(均为寄存器)存储R1,回写地址到R2STR R1,[R2],R4 ;在R2存储R1,回写地址R2+R4到R2LDR R1,[R2,#16] ;从R2+16内容装入R1但不回写LDR R1,[R2,R3,LSL#2];从R2+R3*4内容装入R1LDREQB R1,[R6,#5] ;将R6+5字节有条件地装入R1的0~7位,8~31位填零STR R1,PLACE ;产生PC相对偏移寻址PLACE.PLACE★★8半字和有符号数据转移(LDRH/STRH/LDRSB/LDRSH)该指令仅当条件为真时执行。条件定义见表4-4。指令编码见图4-15、4-16。这些指令用来装载或存储半字数据也装载扩展符号字节或半字数据。转移的存储器地址由一个基本寄存器加上或减去一个偏移量计算得到。如果有要求,计算结果可回写到基本寄存器。图4-15.带寄存器偏置的半字和有符号数据转移图4-16.带立即数偏置和自动标定指数的半字和有符号数据转移★偏置和自动标定在指令中,基址寄存器的偏移量既可以是8bit的无符号立即数,也可以是一个第二寄存器(可能被移位)。当U=1时基址寄存器Rn加上偏移量,而U=0时基址寄存器Rn减去偏移量。偏移量的修改可以在基址寄存器被用于传输地址之前(前索引P=1)或之后(后索引P=0)关于寻址方式是增加还是减少模式,指令的W位(即D21)给出了可选项。当W=1时,修改的基址寄存器值可以回写到基址寄存器中;而当W=0时,基址寄存器值不变。在前索引的寻址方式的情况下;如果有必要,既然通过设置偏移量为零而使旧的基址寄存器值得以保留,那么W位是多余的,且总被设置为0。因此,后索引数据传输总是回写到已经修改的基址寄存器。当选择后索引寻址时,回写位不应该被置为高(即W=1)。★半字装载和存储当设置S=0和H=1时,则可以用于在存储器和寄存器之间传送半字。LDR(B)和STR(B)指令的功能受ARM920T内核BIGEND控制信号的影响。两种可能的结果叙述如下。★有符号字节和半字装载S位控制符号扩展数据的装载。当S=1时,H在字节(H=0)和半字(H=1)之间选择。当S=1时,L位不应该为0(表示存储)。LDRSB指令装载所选的字节到目的寄存器中的7~0位,同时在高24位进行符号扩展。LDRSH指令装载所选的字节到目的寄存器中的15~0位,同时在高16位进行符号扩展。LDRSB和LDRSH指令的功能受ARM920T内核BIGEND控制信号的影响。两种可能的结果叙述如下。★端点形式和字节/半字选择:Little-Endian配置如果提供的地址是以字为边界,则LDRSB指令期望数据总线上装入的数据是7~0这样的一个字节数据;如果一个字地址加1,则通过数据总线上装入15~8,以此类推。这个被选字节被放入目标寄存器的低8位,其余的位作符号扩展。如果提供的地址是以字为边界,则半字装载(LDRSH、LDRH)指令期望数据总线上装入的数据是15~0这样的一个半字数据;如果提供的地址是以半字为边界,则期望数据总线上装入的数据是31~16这样的一个半字数据(A[1]=1)。提供地址总是基于半字的边界。如果A[0]=1,那么ARM920T将导入一个无法预测的值。这个被选半字被放入目标寄存器的低16位;对于其余的位,LDRSH作符号扩展;LDRH填充0。半字存储(STRH)将重复2次存储源寄存器的低16位值到数据总线的31~0。外部存储系统应该激活合适的半字系统来存储数据。注意:地址应该是半字对齐的,如果A[0]=1,那么将引起无法预测的行为。Big-Endian配置如果提供的地址是以字为边界,则LDRSB指令期望数据总线上装入的数据是31~24这样的一个字节数据;如果一个字地址加1,则通过数据总线上装入23~16,以此类推。这个被选字节被放入目标寄存器的低8位,其余的位作符号扩展。如果提供的地址是以字为边界,则半字装载(LDRSH、LDRH)指令期望数据总线上装入的数据是31~16这样的一个半字数据;如果提供的地址是以半字为边界,则期望数据总线上装入的数据是15~0这样的一个半字数据(A[1]=1)。提供地址总是基于半字的边界。如果A[0]=1,那么ARM920T将导入一个无法预测的值。这个被选半字被放入目标寄存器的低16位;对于其余的位,LDRSH作符号扩展;LDRH填充0。半字存储(STRH)将重复2次存储源寄存器的低16位值到数据总线的31~0。外部存储系统应该激活合适的半字系统来存储数据。注意:地址应该是半字对齐的,如果A[0]=1,那么将引起无法预测的行为。★使用R15当R15被用作基址寄存器(Rn),则不应该指定回写位。当将R15用作基址寄存器时,必须记住它包含了在当前指令地址上的一个8bytes地址。R15不能被用作移位寄存器(Rm).当R15被用作一个半字存储指令(STRH)的源寄存器(Rd)时,存储地址必须是指令地址加上12。★数据中止:对存储器管理系统而言,对合法地址的转移也可能出现问题。例如,使用虚拟内存的系统中也许没有主内存。内存管理器通过将处理器ABORT输入变高发出信号,这就出现了数据中止陷阱。直到系统软件解决这个问题,然后指令重新开始执行原程序。★指令周期正常的LDR(H、SH、SB)指令占用1S+1N+1I周期,LDR(H、SH、SB)PC占用2S+2N+1I周期,这里,S、N和I分别定义为顺序(S-周期)、非顺序(N-周期)和内部(I-周期)。STRH指令占用2N执行周期。★汇编程序语法<LDR|STR>{cond}<H|SH|SB>Rd,<address>LDR 将存储器中的值装入寄存器中STR 将寄存器中的值存到存储器中{cond} 条件码,参见表4-4H 传输半字SB 装载有符号字节(仅对于LDR有效)SH 装载有符号半字(仅对于LDR有效)Rd 有效寄存器<Address>可以是:表示产生一个地址:汇编程序将会产生一条指令,该指令以PC为基础和有表达给出的校正后的直接偏置地址。这是一个相对的、预寻址地址PC。如果地址超出范围,给出出错信息。2 预索引寻址:[Rn] 零偏置[Rn,<#expression>]{!} <expression>字节偏置[Rn,{+/-}Rm{,<shift>}]{!} 变址寄存器+/-偏置,由<shift>移位3 后索引寻址:[Rn],<#expression> <expression>字节偏置[Rn],{+/-}Rm 变址寄存器+/-偏置,由<shift>移位4Rn和Rm用作寄存器操作数。如果Rn是R15,则汇编后将在当前ARM920T流水线地址中减去8。在此情况下,不应该指定回写。{!} 如果出现!写回基本寄存器(见W位)例子LDRH R1,[R2,-R3]! ;将存在R2-R3地址中的半字装入R1,并回写R2STRH R3,[R4,#14] ;将R3中的半字存储到R14+14中,不回写LDRSBR8,[R2],#-223;将R2地址中的有符号数据字节存入R8中,并回写R2-223到R2中LDRNESHR11,[R0];有条件,将R0存储地址中的内容半字装入R11中,并作符号扩展HERE ;产生PC相对于地址FRED的相对偏移量STRH R5,[PC,#(FRED-HERE-8)] ;存储R5中的半字到地址FRED中FRED★★9块数据转移(LDM、STM)该指令仅当条件为真时执行,条件定义见表4-4。指令编码见图4-17。块传输指令用于装载(LDM)或存储(STM)当前的可以使用的存储器。它们支持所有可能的堆栈模式(满堆栈或空堆栈)。寄存器列表寄存器列表在指令里面占有16位,每一个位对应一个寄存器。如bit0=1,表示对R0进行操作;反之,不对其进行操作。依此类推。注意:寄存器列表不能为空。无论何时将R15存入存储器,存储的值都是STM的指令地址+12。图4-17.数据块转移指令★寻址方式传输地址由基址寄存器(Rn)的内容确定,同时对Rn存在正偏移/负偏移(U位)和前索引/后索引(P位)。寄存器列表的传输是根据从低到高的顺序来进行的,所以R15(如果在寄存器列表中)总是在最后进行传输。最低的寄存器也总是被传输到最低的存储器地址,或从最低存储器地址导入。假设考虑传输R1、R5、R7,基址寄存器Rn=0x1000,同时回写修改基址寄存器(W=1)。图4-22给出了传输的结果。如果在W=0的情况下,基址寄存器Rn将保持其初始值0x1000,除非它也存在于寄存器列表中。★地址排列地址通常是字对齐排列,非字对齐排列不影响指令。图4-18.增量后寻址图4-19.增量前寻址图4-20.减量后寻址图4-21.减量前寻址★使用S位:当指令LDM/STM中设置了S位时,它表示的意思则将依靠R15是否在指令表中或者依靠指令类型。所以,仅仅在特权模式下执行指令时,S位才应该置位。R15存在于指令列表中,同时S=1(模式改变),LDM指令如果指令为LDM,那么在R15被装入的同时SPSR_<mode>被转移到CPSR。R15存在于指令列表中,同时S=1(用户页传输),STM指令传输的寄存器来自于用户页而不是当前模式的相应页。这对于在过程转换中存储用户状态是有用的。在这种机制下,基址回写不能使用。R15不存在于指令列表中,同时S=1(用户页传输)对于LDM和STM指令,用户页中的寄存器被用于传输而不是当前相应模式下的寄存器。这对于在过程转换中存储用户状态是在这种机制下,基址回写不能使用。R15作基本寄存器使用在任何LDM或STM指令中不应将R15作基寄存器。INCLUSIONOFTHEBASEINTHEREGISTERLIST寄存器列表中基址的列入当回写操作被指定时,基址在指令的第2个时钟周期结束后被回写。在STM指令期间,第一个寄存器在第2个时钟周期被写出;之后在回写基址。如果基址在寄存器列表中,指令LDM总是要修改基址寄存器。DATAABORTS数据中止某些合法的寻址方式并不能被存储器管理系统所接受;同时存储器管理系统将ABORT信号置为高,表示寻址出现问题。这种情况出现在多寄存器装载或存储中;如果ARM920T被使用在虚拟存储系统中,则寻址可以重新获得。AbortduringSTMInstructions在STM指令期间中止如果数据中止在STM指令中发生,ARM920T对此将不做任何操作,直到指令完成,然后进入数据中止陷进。存储器管理系统负责防止错误写入内存里面。对处理器的内部状态的改变仅仅对基址寄存器的修改(如果指定了回写状态);同时在指令重试前由软件更改。AbortsduringLDMInstructions在LDM指令期间中止当ARM920T在LDM指令期间检测到了数据中止,它将修改指令的操作以保证恢复的可能。当数据中止发生时,寄存器组重新写入被阻止。中止装载将不会发生,但先前的寄存器被重写。PC总是被写入的最后一个寄存器,所以总是被保护。如果要求回写,为了修改值,则基址寄存器被重新存入。这就保证了在基址寄存器也在传输列表中的情况下的恢复的可能性,同时在中止发生前被重新写入。指令周期正常的LDM指令占用nS+1N+1I周期,LDMPC占用(n+1)S+2N+1I周期,这里,S、N和I分别定义为顺序(S-周期)、非顺序(N-周期)和内部(I-周期)。STM指令占用(n-1)S+2N执行周期,这里n为转移的字节数。汇编程序语法<LDM|STM>{cond}<FD|ED|FA|EA|IA|IB|DA|DB>Rn{!},<Rlist>{^}这里:{cond} 双字母条件助记符,见表4-4Rn 有效寄存器号表示式<Rlist> 括在{}中的寄存器表和寄存器范围(即{R0,R2-R7,R10}).{!} 如果出现请求,回写(W=1),其余W=0.{^} 如果出现,S位置位,连同PC装入CPSR,或在特许模式下强制用户空间转移寻址方式名称表4-8寻址方式名称参考堆栈要求的形式,FD,ED,FA,EA定义了前/后索引和上/下偏移。F和E分别指的是“满”或“空”堆栈,A和D分别指堆栈的递增和递减。IA,IB,DA,DB用于堆栈以外的其他LDM/STM操作例:LDMFD SP!,{R0,R1,R2} ;将3个寄存器压栈STMIA R0,{R0-R15} ;存储所有的寄存器LDMFD SP!,{R15} ;R15(SP),CPSR不改变LDMFD SP!,{R15}^ ;R15(SP),CPSR<-SPSR_mode,仅用于特权模式STMFD R13,{R0-R14}^ ;将用户模式寄存器放入堆栈中,仅用于特权模式以下这些指令主要用于存储子程序入口状态,同时在子程序调用返回后在此存储。STMEDSP!,{R0-R3,R14} ;将R0到R3存储到空间,同时R14用于返回BL somewhere ;修改R14LDMEDSP!,{R0-R3,R15} ;存储空间,并返回SINGLEDATASWAP(SWP)单数据交换图3-23.交换指令Theinstructionisonlyexecutediftheconditionistrue.ThevariousconditionsaredefinedinTable3-2.TheinstructionencodingisshowninFigure3-23.Thedataswapinstructionisusedtoswapabyteorwordquantitybetweenaregisterandexternalmemory.Thisinstructionisimplementedasamemoryreadfollowedbyamemorywritewhichare“locked”together(theprocessorcannotbeinterrupteduntilbothoperationshavecompleted,andthememorymanageriswarnedtotreatthemasinseparable).Thisclassofinstructionisparticularlyusefulforimplementingsoftwaresemaphores.Theswapaddressisdeterminedbythecontentsofthebaseregister(Rn).Theprocessorfirstreadsthecontentsoftheswapaddress.Thenitwritesthecontentsofthesourceregister(Rm)totheswapaddress,andstorestheoldmemorycontentsinthedestinationregister(Rd).Thesameregistermaybespecifiedasboththesourceanddestination.TheLOCKoutputgoesHIGHforthedurationofthereadandwriteoperationstosignaltotheexternalmemorymanagerthattheyarelockedtogether,andshouldbeallowedtocompletewithoutinterruption.Thisisimportantinmulti-processorsystemswheretheswapinstructionistheonlyindivisibleinstructionwhichmaybeusedtoimplementsemaphores;controlofthememorymustnotberemovedfromaprocessorwhileitisperformingalockedoperation.该指令仅当条件为真时执行。条件定义见表3-2。指令编码见图3-23。BYTESANDWORDS字节和字Thisinstructionclassmaybeusedtoswapabyte(B=1)oraword(B=0)betweenanARM920Tregisterandmemory.TheSWPinstructionisimplementedasaLDRfollowedbyaSTRandtheactionoftheseisasdescribedinthesectiononsingledatatransfers.Inparticular,thedescriptionofBigandLittleEndianconfigurationappliestotheSWPinstruction.USEOFR15使用R15DonotuseR15asanoperand(Rd,RnorRs)inaSWPinstruction.不要在SWP指令中将R15作操作数(Rd、Rn或Rs)。DATAABORTS数据中止Iftheaddressusedfortheswapisunacceptabletoamemorymanagementsystem,thememorymanagercanflagtheproblembydrivingABORTHIGH.Thiscanhappenoneitherthereadorthewritecycle(orboth),andineithercase,theDataAborttrapwillbetaken.Itisuptothesystemsoftwaretoresolvethecauseoftheproblem,thentheinstructioncanberestartedandtheoriginalprogramcontinued.INSTRUCTIONCYCLETIMES指令周期Swapinstructionstake1S+2N+1Iincrementalcyclestoexecute,whereS,NandIaredefinedassequential(S-cycle),non-sequential,andinternal(I-cycle),respectively.SWAP指令占用1S+2N+1I周期,这里,S、N和I分别定义为顺序(S-周期)、非顺序(N-周期)和内部(I-周期)。ASSEMBLERSYNTAX汇编程序语法<SWP>{cond}{B}Rd,Rm,[Rn]{cond} Two-characterconditionmnemonic.SeeTable3-2.{B} IfBispresentthenbytetransfer,otherwisewordtransferRd,Rm,Rn ExpressionsevaluatingtovalidregisternumbersExamplesSWP R0,R1,[R2] ;LoadR0withthewordaddressedbyR2,and;storeR1atR2.SWPB R2,R3,[R4] ;LoadR2withthebyteaddressedbyR4,and;storebits0to7ofR3atR4.SWPEQR0,R0,[R1] ;Conditionallyswapthecontentsofthe;wordaddressedbyR1withR0.<SWP>{cond}{B}Rd,Rm,[Rn]{cond} 双字母条件助记符,见表3-2{B} 如果出现B为字节转移,其余为字转移Rd,Rm,Rn 有效寄存器号表示式ExamplesSWP R0,R1,[R2] ;将以R2为地址的字装入R0,并在R2储存R1SWPB R2,R3,[R4] ;将以R4为地址的字装入R2,并在R4储存R3的0~7位SWPEQR0,R0,[R1] ;有条件地与R0交换以R1为地址字的内容SOFTWAREINTERRUPT(SWI)软件中断Theinstructionisonlyexecutediftheconditionistrue.ThevariousconditionsaredefinedinTable3-2.TheinstructionencodingisshowninFigure3-24,below.该指令仅当条件为真时执行。条件定义见表3-2。指令编码见图3-24。图3-24.软件中断指令ThesoftwareinterruptinstructionisusedtoenterSupervisormodeinacontrolledmanner.Theinstructioncausesthesoftwareinterrupttraptobetaken,whicheffectsthemodechange.ThePCisthenforcedtoafixedvalue(0x08)andtheCPSRissavedinSPSR_svc.IftheSWIvectoraddressissuitablyprotected(byexternalmemorymanagementhardware)frommodificationbytheuser,afullyprotectedoperatingsystemmaybeconstructed.软件中断指令用于进入超级用户模式。该指令产生导致模式改变的软件中断陷阱。强制PC为固定值(0x08),CPSR被存入SPSR_svc。如果SWI向量地址从用户修改方式得到保护(由外部存储器管理硬件),就建立起完全受保护的操作系统。RETURNFROMTHESUPERVISOR从超级用户模式返回ThePCissavedinR14_svcuponenteringthesoftwareinterrupttrap,withthePCadjustedtopointtothewordaftertheSWIinstruction.MOVSPC,R14_svcwillreturntothecallingprogramandrestoretheCPSR.在进入软件中断陷阱时,PC被存入R14_svc,然后PC指向SWI指令后的字。MOVSPC,R14_svc将返回调用程序,并再存CPSR。Notethatthelinkmechanismisnotre-entrant,soifthesupervisorcodewishestousesoftwareinterruptswithinitselfitmustfirstsaveacopyofthereturnaddressandSPSR.注意链接机制可以再次进入,所以如果超级用户程序希望在自身中使用软件中断,必须先复制返回地址和SPSR。COMMENTFIELD注释区Thebottom24bitsoftheinstructionareignoredbytheprocessor,andmaybeusedtocommunicateinformationtothesupervisorcode.Forinstance,thesupervisormaylookatthisfieldanduseittoindexintoanarrayofentrypointsforroutineswhichperformthevarioussupervisorfunctions.处理器不理会指令的低24位,或许可用作超级用户程序的通讯信息。例如,超级用户可以查看该区,并用它来标记执行各种超级用户功能程序入口点阵列。INSTRUCTIONCYCLETIMES指令周期Softwareinterruptinstructionstake2S+1Nincrementalcyclestoexecute,whereSandNaredefinedassequential(S-cycle)andnon-sequential(N-cycle).软件中断指令占用2S+1N周期,这里,S和N分别定义为顺序(S-周期)和非顺序(N-周期)。ASSEMBLERSYNTAX汇编程序语法SWI{cond}<expression>{cond} Twocharacterconditionmnemonic,Table3-2.<expression> Evaluatedandplacedinthecommentfield(whichisignoredbyARM920T).ExamplesSWI ReadC ;Getnextcharacterfromreadstream.SWI WriteI+"k” ;Outputa"k"tothewritestream.SWINE 0 ;Conditionallycallsupervisorwith0incommentfield.SWI{cond}<expression>{cond} 双字母条件助记符,见表3-2<expression> 估计和放入注释区(ARM920T不理睬).ExamplesSWI ReadC ;从读流程中得到下一个字母SWI WriteI+"k” ;在写流程中输出‘k’SWINE 0 ;有条件调用注释区0超级用户Supervisorcode超级用户代码Thepreviousexamplesassumethatsuitablesupervisorcodeexists,forinstance:0x08BSupervisor ;SWIentrypointEntryTable ;AddressesofsupervisorroutinesDCDZeroRtnDCDReadCRtnDCDWriteIRtnZero EQU0ReadC EQU256WriteI EQU512Supervisor ;SWIhasroutinerequiredinbits8-23anddata(ifany)in;bits0-7.AssumesR13_svcpointstoasuitablestackSTMFD R13,{R0-R2,R14} ;Saveworkregistersandreturnaddress.LDR R0,[R14,#-4] ;GetSWIinstruction.BIC R0,R0,#0xFF000000 ;Cleartop8bits.MOV R1,R0,LSR#8 ;Getroutineoffset.ADR R2,EntryTable ;Getstartaddressofentrytable.LDR R15,[R2,R1,LSL#2] ;Branchtoappropriateroutine.WriteIRtn ;EnterwithcharacterinR0bits0-7.LDMFD R13,{R0-R2,R15}^ ;Restoreworkspaceandreturn,;restoringprocessormodeandflags.COPROCESSORDATAOPERATIONS(CDP)协处理器数据操作Theinstructionisonlyexecutediftheconditionistrue.ThevariousconditionsaredefinedinTable3-2.TheinstructionencodingisshowninFigure3-25.Thisclassofinstr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论