第3章 ARM920T指令系统_第1页
第3章 ARM920T指令系统_第2页
第3章 ARM920T指令系统_第3页
第3章 ARM920T指令系统_第4页
第3章 ARM920T指令系统_第5页
已阅读5页,还剩116页未读 继续免费阅读

下载本文档

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

文档简介

1第3章ARM920T指令系统12本章重点:⑴ARM指令集概述,ARM指令集全部指令编码及条件域;⑵ARM指令,讲述了ARM指令的编码格式、指令含义、汇编格式和使用举例。另外,本章指令编码格式、指令汇编格式请直接看参考书。3S3C2410A嵌入式微处理器片内使用了ARM920T内核,因此S3C2410A使用ARM920T所支持的指令系统。ARM920T指令系统的指令集结构版本为v4T,ARM920T指令系统含有v4T以上指令集结构版本的基础指令,在v4T以上指令集结构版本的微处理器中都可以运行。ARM920T处理器支持32位寻址空间。4ARM920T支持指令长度为32位的ARM指令集和指令长度为16位的Thumb指令集。ARM920T处理器总是从ARM状态开始,必须用BX指令明确地转换到Thumb状态。53.1ARM指令集概述3.1.1ARM指令集概述⒈ARM指令分组⑴分支指令⑵数据处理指令⑶状态寄存器访问指令⑷单个寄存器装入或存储指令⑸块数据装入或存储指令⑹协处理器指令6⒉ARM指令的能力⑴条件执行⑵寄存器访问⑶对在线式桶形移位器(barrelshifter)的访问73.1.2ARM指令集全部指令编码及条件域⒈ARM指令集全部指令编码格式ARM指令集全部指令编码格式见图3.1。89⒉指令编码中的条件域指令编码格式中的bit[31:28]称为条件域。在ARM状态,所有指令都要根据CPSR中的条件码标志和指令中条件域指定的内容,有条件地执行。指令中条件域bit[31:28]确定在哪一种情况下这条指令被执行。如果C、N、Z和V标志的状态满足指令中条件域编码要求,指令被执行;否则指令被忽略。10有15种可能的条件,每一种由2个字符代替,称为条件码助记符后缀(简称条件码助记符),可以附加在指令助记符后,如表3.1所示。例如在汇编语言中,分支指令B如果附加条件码助记符后缀为EQ,写作BEQ,表示相等(即Z=1)这条指令才执行;如果Z<>1,则这条指令不被执行,指令被忽略。11表3.1指令条件码表(1)条件码助记符标志含义EQZ=1相等NEZ=0不相等CS/HSC=1无符号数大于或等于CC/LOC=0无符号数小于MIN=1负数(minus

)PLN=0正数或零VSV=1上溢出VCV=0没有上溢出12表3.1指令条件码表(2)条件码助记符标志含义HIC=1,Z=0无符号数大于LSC=0,Z=l无符号数小于或等于GEN=V有符号数大于或等于LTN!=V有符号数小于GTZ=0,N=V有符号数大于LEZ=1,N!=V有符号数小于或等于AL任何无条件执行(指令默认条件)NVARMv3之前该指令从不执行133.2ARM指令本节讲述的内容和先后次序如下:分支并且转换状态指令(BX);分支、分支并且连接指令(B、BL);数据处理指令;程序状态寄存器传送指令(MRS、MSR);乘、乘累加指令(MUL、MLA);长乘、长乘累加指令(MULL、MLAL);14单个数据传送指令(LDR、STR);半字、带符号字节/半字传送指令(LDRH、STRH、LDRSB、LDRSH);块数据传送指令(LDM、STM);单个数据交换指令(SWP);软件中断指令(SWI);协处理器介绍;15协处理器数据操作指令(CDP);协处理器数据传送指令(LDC、STC);协处理器寄存器传送指令(MRC、MCR);未定义指令。163.2.1分支并且转换状态指令(BX)分支并且转换状态指令BX,在指令中指定了一个Rn寄存器,将Rn内容拷贝到PC,同时使PC[0]=0;把Rn[0]的值送CPSR的T位。如果Rn[0]=1,则T=1,将处理器状态转换成Thumb状态,把目标地址处的代码解释为Thumb代码;如果Rn[0]=0,则T=0,将处理器状态转换成ARM状态,把目标地址处的代码解释为ARM代码。17⒈指令含义通过拷贝一个通用寄存器Rn的内容到程序计数器PC,指令实现分支功能。这条指令也允许指令集被转换,当这条指令被执行时,Rn的bit[0]位确定后续指令代码被译码作为ARM指令或Thumb指令。18⒉指令汇编格式

BX{cond}Rn其中:{cond}表示两个字符的条件码助记符;Rn 表示合法的寄存器编号19⒊使用举例【例3.1】处理器从执行ARM指令代码处分支到标号为Goto_THUMB处,并且执行Thumb指令代码,然后又返回到Back_ARM处,执行ARM指令代码。20;假定处理器当前正在执行ARM指令ADRR1,Goto_THUMB+1

BXR1;分支并且转换为Thumb状态

CODE16;汇编以下代码为Thumb指令Goto_THUMB;分支目标地址标号

…;Thumb指令代码

ADRR2,Back_ARM;将分支目标地址送R2,并且R2的bit[0]=0

BXR2;分支且转换为ARM状态

…ALIGN;字对齐

CODE32;汇编以下代码为ARM指令Back_ARM;分支目标地址标号

…;ARM指令代码213.2.2分支、分支并且连接指令

(B、BL)分支指令B使程序分支(转移)到确定的地址处执行程序。分支并且连接指令BL除了使程序分支(转移)到确定的地址处执行程序外,还要保存返回地址到LR寄存器,即把BL指令的下一条指令的地址送LR。使用BL指令可以实现子程序调用。上述两条指令分支目标地址处的指令均应该属于ARM指令集,不允许分支到Thumb指令处。22⒈指令含义对于分支指令B,bit[23:0]是24位带符号的偏移量,将其左移2位,符号位扩展到bit[31:26]形成一个32位数,与PC相加实现分支。因此指令能在±32MB地址范围内实现分支。分支偏移量必须考虑流水线指令预取操作,PC值是当前正在执行指令的地址加8的值。23对于分支并且连接指令BL,执行指令会将PC值写入当前寄存器组的连接寄存器R14,写入的PC值是经过调整的、跟在分支并且连接指令后的指令的地址,同时R14的bit[1:0]被清0。使用分支并且连接指令BL可以调用一个子程序,为了从子程序返回,如果R14(LR)在子程序中没有被修改,可以使用MOVPC,R14指令实现返回。24⒉指令汇编格式B{L}{cond}<expression>

{L}表示分支并且链接{cond}条件码助记符<expression>目标地址25⒊使用举例

【例3.2】使用分支指令使部分代码循环5次。MOVR0,#5;R0值为5Loop1

SUBSR0,#1;R0减1送R0,设置标志位

BNELoop1;使用了条件码,不为0则分支到标号Loop1处26【例3.3】使用分支并且连接指令调用不同的子程序。CMPR0,#0;比较,设置标志位

BLEQSUBEQROG;相等,则调用SUBEQBLGTSUBGTROG;大于,则调用SUBGT

BLSUBLTROG;小于,则调用SUBLT273.2.3数据处理指令ARM数据处理指令可以分为三类:数据传送指令(如MOV和MVN)、算术逻辑操作指令(如ADD、SUB或AND等)比较指令(如CMP和TST等)。数据处理指令只能对寄存器的内容进行操作,不允许对存储器中的数据进行操作,也不允许指令直接使用存储器的数据或在寄存器与存储器之间传送数据。28对于数据传送指令MOV和MVN,指令中指定的目的寄存器内容被覆盖,如果目的寄存器指定了PC,如MOVPC,R14,则可以实现程序的转移。数据传送指令可以实现寄存器到寄存器,立即数到寄存器的传送。29算术逻辑操作指令通常对指定的两个寄存器(或1个寄存器、1个立即数)进行操作,结果存到第3个寄存器,允许选择修改或不修改CPSR中的条件码标志。比较指令TEQ、TST、CMP和CMN,通常对指定的两个寄存器(或1个寄存器,1个立即数)进行比较,比较结果不保存到寄存器,只影响CPSR中的条件码标志。上述指令通常允许对指定的操作数进行移位操作。30⒈指令编码格式指令编码格式见图3.2。第1操作数总是寄存器Rn。Rd称为目的寄存器,TST、TEQ、CMP和CMN指令不送结果到目的寄存器Rd,其他指令产生的结果送Rd。第2操作数Operand2可以是寄存器Rm的值经过移位产生的32位值,或8位立即数经过循环右移产生的32位的值,指令中bit[25]的值用来选择Rm或8位立即数。31图3.232CPSR中的条件码可能被保护或由指令的结果设置,取决于指令中bit[20]的值。但是对于指令TST、TEQ、CMP和CMN,汇编器产生的指令编码一定会把指令的bit[20]置1,在执行指令时,由测试结果设置CPSR中的条件码标志。33⒉指令含义⑴各指令含义数据处理指令依指令编码格式中bit[24:21]分为16条指令,包括:数据传送算术逻辑操作比较指令各条指令含义见表3.2。数据传送操作(MOV、MVN)算术操作(ADD、ADC、SUB、SBC、RSB、RSC)逻辑操作(AND、ORR、EOR、BIC)比较指令(TST、TEQ、CMP和CMN)3435⑵指令对CPSR中条件码标志位的影响在逻辑操作(AND、ORR、EOR、BIC、TST、TEQ)和数据传送操作(MOV、MVN)指令中,如果S位被置1(并且Rd不是R15),则CPSR中的V标志位不受影响;C标志位由桶形移位器产生的carryout设置;当指令操作结果为全0时Z标志位被设置;N标志位由指令操作结果的bit[31]的值设置。36算术操作(ADD、ADC、SUB、SBC、RSB、RSC、CMP、CMN)指令中,每个操作数被看作32位整数(无符号数或带符号数的2进制补码),如果指令中S位被置1(并且Rd不是R15),在发生溢出时,CPSR中的V标志位被设置;C标志位由ALU的bit[31]产生的进位设置;如果指令操作结果为全0时,Z标志位被设置;N标志位将被设置成指令操作结果的bit[31]的值。37⑶对寄存器Rm内容进行移位,结果作为Operand2的值图3.3桶形移位器38ALU桶形移位器Rd结果N预处理未预处理RmRn39①使用指令中bit[11:7]指定的移位量对Rm移位·逻辑左移(LSL)图3.4逻辑左移(LSL#6)

40·逻辑右移(LSR)图3.5逻辑右移(LSR#6)

41·算术右移(ASR)图3.6算术右移(ASR#6)

42·循环右移(ROR)图3.7循环右移(ROR#6)

43图3.8扩展循环右移(RRX)RRX循环右移1位,带扩展44在使用指令中bit[11:7]指定对Rm的移位量,bit[6:5]指定移位类型时,指令汇编格式举例见表3.3。45表3.3指令bit[11:7]和bit[6:5]指定Rm移位量和移位类型举例

指定对Rm的移位量和移位类型指令举例指令含义Rm,LSL#5bit_shift_ImmADDR0,R2,R3,LSL#1R3的值逻辑左移1位,加R2,和送R0Rm,LSR#5bit_shift_ImmSUBR0,R2,R3,LSR#2R3的值逻辑右移2位,从R2中减去,差送R0Rm,ASR#5bit_shift_ImmMOVR1,R0,ASR#2R0的值算术右移2位,送R1Rm,ROR#5bit_shift_ImmSUBR1,R2,R4,ROR#6R4的值循环右移6位,从R2中减去,差送R1Rm,RRXANDR2,R3,R4,RRXR4的值扩展循环右移,和R3与的结果送R246②使用指令中bit[11:8]指定Rs寄存器,且用Rs中最低字节指定移位量参见图3.2和图3.3,由指令中bit[11:8]指定Rs寄存器,移位量保存在Rs寄存器的最低字节,对Rm寄存器的内容进行移位,产生的结果作为Operand2的值。如果Rs中指定的移位次数为0,那么不改变Rm的内容作为Operand2,并且CPSR中C位的值作为carryout,即C位的值不变。如果Rs中最低字节指定的移位次数在1~31之间,进行的移位操作与产生的结果参阅图3.4、3.5、3.6、3.7。47如果Rs中最低字节指定的移位次数大于、等于32,产生的结果如下:·对LSL,如果移位次数等于32,移位结果Operand2为全0,Rm[0]作为carryout。·对LSL,如果移位次数大于32,移位结果Operand2为全0,carryout为0。·对LSR,如果移位次数等于32,移位结果Operand2为全0,Rm[31]作为carryout。·对LSR,如果移位次数大于32,移位结果Operand2为全0,carryout为0。·对ASR,如果移位次数大于、等于32,用Rm[31]填充Operand2各位,用Rm[31]作为carryout。48·对ROR,如果移位次数等于32,移位结果Operand2等于Rm的值,carryout等于Rm[31]。·对于ROR,如果移位次数大于32,用移位次数重复减32,直到它们的差在1~32之间,用这个值作为移位次数,移位结果如前述。对于上述各种情况,carryout的值,均送往CPSR中的进位标志C。使用Rs指定移位量时,指令中bit[6:5]指定移位类型,指令汇编格式举例见表3.4。49表3.4用Rs指定Rm的移位量和指令中bit[6:5]指定移位类型举例指定Rm的移位量和移位类型指令举例指令含义Rm,LSLRsADDR0,R1,R2,LSLR3移位量在R3中,R2逻辑左移,加R1,和送R0Rm,LSRRsSUBR0,R1,R2,LSRR4移位量在R4中,R2逻辑右移,从R1中减去,差送R0Rm,ASRRsANDR1,R2,R3,ASRR0移位量在R0中,R3算术右移,和R2逻辑与,结果送R1Rm,RORRsMOVR2,R4,RORR0移位量在R0中,R4循环右移,送R250⑷对指令中bit[7:0]指定的8位无符号立即数循环右移参见图3.2,对指令中bit[7:0]指定的8位无符号立即数进行循环右移时,用bit[11:8]指定移位量,它是一个4位无符号整数。进行移位操作时,要把指令中bit[7:0]指定的8位无符号立即数作为最低字节,高位bit[31:8]用0扩展,形成一个32位数,对这个32位数进行循环右移。移位的次数,由指令中bit[11:8]指定的4位无符号数乘以2得到,分别为0,2,4,…30。此外,移位过程可参见图3.7。⑸关于R15和CPSR中的条件码标志51⒊指令汇编格式数据传送操作(MOV、MVN)opcode{cond}{S}Rd,<op2>算术操作(ADD、ADC、SUB、SBC、RSB、RSC)和逻辑操作(AND、ORR、EOR、BIC)opcode{cond}{S}Rd,<op2>比较指令(TST、TEQ、CMP和CMN)opcode{cond}Rd,<op2>52⒋使用举例

⑴数据传送和数据求反传送指令举例

MOVSR4,R3,LSL#2;R4等于R3逻辑左移2位的值,设置标志位

MOVSPC,R14;PC=R14,且CPSR=SPSR_<mode>,用于从;异常返回

MOVR15,LR;PC=R14,用于从子程序返回

MVNR0,R1;R1的值求反送R0

MVNR2,#0xf0;R2=0xffffff0f

MVNR0,#0;R0=0xffffffff,即R0=-153以下举例见参考书⑵算术操作指令举例⑶逻辑操作指令举例⑷比较与测试指令举例⑸使用移位操作的指令举例⑹程序举例54以下举例见参考书【例3.4】如果R0=1或者R1=2,则程序分支到标号为Label0处;否则,执行标号为Label1处的代码。【例3.5】求R0的绝对值,再求R1的绝对值,将这两个绝对值相加,和存R2。求绝对值的方法是:当Rn>=0时,Rn的值不变;否则,将Rn的值求补。【例3.6】对于R1中的无符号数,判断其值的不同范围,作不同的计算。55以下举例见参考书【例3.7】求R0*4+R1*5-R2*7的值,假定它们都是无符号数,运算结果也不会产生进位,结果存R3中。【例3.8】从子程序返回和从异常返回的区别。3.2.4程序状态寄存器传送指令(MRS、MSR)只有程序状态寄存器传送指令MRS、MSR,才允许读/写程序状态寄存器CPSR或SPSR_<mode>。程序中不允许通过MSR指令直接修改CPSR中的T控制位来实现ARM/Thumb状态的转换,只能通过BX指令去实现ARM/Thumb状态的转换56⒈指令编码格式指令编码格式见图3.9、3.10和3.11。⒉指令含义MRS指令允许将CPSR或SPSR_<mode>的内容传送到一个通用寄存器。MSR指令允许将一个通用寄存器的内容传送到CPSR或SPSR_<mode>寄存器。MSR指令也允许将一个立即数或寄存器的内容只传送到CPSR或SPSR_<mode>寄存器的条件码标志(N、Z、C和V),而不影响其他控制位。在这种情况下,指定寄存器的最高4位或立即数的最高4位的内容被写入CPSR或SPSR_<mode>的最高4位(条件码标志)。57⒊指令汇编格式MRS{cond}Rd,<psr>MSR{cond}<psr>,RmMSR{cond}<psrf>,RmMSR{cond}<psrf>,<#expression>⒋使用举例

在User(用户)方式和特权方式,某些相同格式的指令,产生的作用是不相同的。58

;在用户方式MSRCPSR,R0;R0[31:28]送CPSR[31:28]

MSRCPSR_flg,R0;R0[31:28]送CPSR[31:28]

MSRCPSR_flg,#0xf0000000;0xf送CPSR[31:28]

MRSR0,CPSR;CPSR[31:0]送R0[31:0]

;在特权方式

MSRCPSR,R0;R0[31:0]送CPSR[31:0]

MSRCPSR_flg,R0;R0[31:28]送CPSR[31:28]

MSRCPSR_flg,#0xf0000000;0xf送CPSR[31:28]

MSRSPSR,R0;R0[31:0]送SPSR_<mode>[31:0]

MSRSPSR_flg,R0;R0[31:28]送SPSR_<mode>[31:28]

MSRSPSR_flg,#0x30000000;0x3送SPSR_flg[31:28]

MRSR1,SPSR;SPSR_<mode>[31:0]送R1[31:0]59【例3.9】允许FIQ中断,禁止FIQ中断。ENABLE_FIQ MRSR0,CPSR BICR0,R0,#0x40 MSRCPSR,R0 MOVPC,LRDISABLE_FIQ MRSR0,CPSR ORRR0,R0,#0x40 MSRCPSR,R0 MOVPC,LR

603.2.5乘、乘累加指令(MUL、MLA)乘指令MUL实现32位数乘32位数,只保留积的低32位,操作数和结果均在指定的寄存器中。乘累加指令MLA实现32位数乘32位数,积的低32位与另外一个32位数累加,结果保留32位。操作数和结果均在指定的寄存器中。61⒈指令含义乘指令的结果存Rd中,即Rd=Rm*Rs,为了与以后的指令集兼容,Rn应设置为0。乘累加的结果存Rd中,即Rd=Rm*Rs+Rn。⒉指令汇编格式MUL{cond}{S}Rd,Rm,RsMLA{cond}{S}Rd,Rm,Rs,Rn623.2.6长乘、长乘累加指令

(MULL、MLAL)长乘指令实现32位数乘32位数,积保留64位,操作数和结果均在指定的寄存器中。长乘累加指令实现32位数乘32位数,积保留64位,与另一个64位数相加,结果保留64位。操作数和结果均在指定的寄存器中。UMULL为无符号数长乘、SMULL为带符号数长乘、UMLAL为无符号数长乘累加、SMLAL为带符号数长乘累加指令。63⒈指令含义长乘指令64位结果中,高32位存RdHi、低32位存RdLo寄存器中,即RdHi、RdLo=Rm*Rs。长乘累加指令64位结果存RdHi和RdLo中,即RdHi、RdLo=Rm*Rs+RdHi、RdLo。指令中RdHi和RdLo事先要保存进行加法的一个64位操作数,分别保存高、低32位。R15不能使用。RdHi、RdLo和Rm必须指定不同的寄存器。64⒉指令汇编格式UMULL{cond}{S}RdLo,RdHi,Rm,RsUMLAL{cond}{S}RdLo,RdHi,Rm,RsSMULL{cond}{S}RdLo,RdHi,Rm,RsSMLAL{cond}{S}RdLo,RdHi,Rm,Rs65⒊使用举例【例3.10】检测长乘指令结果是否超过32位。

方法1:对无符号数32位乘32位运算,指令产生的结果是64位无符号数,如果结果的高32位为全0,那么结果的有效值仅使用低32位即可;如果结果的高32位不为全0,那么结果的有效值应该使用64位。66

UMULLR1,R2,R3,R4;R2、R1=R3*R4TEQR2,#0;测试结果高32位是否为全0

BNEResult64;不是全0,分支到结果使用64位有效值处;结果有效值使用32位

…Result64

…67

方法2:对带符号数32位乘32位运算,指令产生的结果是64位带符号数,存于RdHi和RdLo中。如果RdHi为全0,并且RdLo[31]=0,那么结果的有效值仅使用RdLo中的低32位即可;如果RdHi为全1,并且RdLo[31]=1,那么结果的有效值仅使用RdLo中的低32位即可。如果不是这两种情况,那么结果的有效值应该使用64位。(程序见参考书)683.2.7单个数据传送指令(LDR、STR)

3.2.8半字、带符号字节/半字传送指令(LDRH、STRH、LDRSB、LDRSH)执行一条单个数据传送指令只能在存储器和寄存器之间传送一字节或一个字数据。半字、带符号字节/半字传送指令允许在寄存器与存储器之间装入和存储半字数据、装入带符号扩展的字节或半字数据69单寄存器传送指令LDR把一个字装入一个寄存器Rd←mem32[address]STR从一个寄存器保存一个字或者一个字节Rd→mem32[address]LDRB把一个字节装入一个寄存器Rd←mem8[address]STRB从一个寄存器保存一个字节Rd→mem8[address]LDRH把一个半字节装入一个寄存器Rd←mem16[address]STRH从一个寄存器保存一个半字Rd→mem16[address]LDRSB把一个有符号字节装入寄存器Rd←signExtent(mem8[address])STRSH把一个有符号半字装入寄存器Rd←signExtent(mem16[address])70LDR指令从存储器指定地址装入一个字数据到目的寄存器。LDRB指令从存储器指定地址装入一字节数据到目的寄存器的bit[7:0],bit[31:8]填0。STR指令保存寄存器一个字数据到存储器指定地址。STRB指令保存寄存器的低8位数据到存储器指定地址。存储器的地址通过计算得到,需要对基址寄存器加偏移量,或从基址寄存器减偏移量产生。71指令含义--1LDRH指令从存储器装入半字数据到寄存器低16位,高16位用0扩展;STRH指令保存寄存器中的低半字数据到存储器;LDRSB指令从存储器装入一字节数据到寄存器bit[7:0],用符号位bit[7]扩展寄存器的bit[31:8];LDRSH指令从存储器装入半字数据到寄存器bit[15:0],用符号位bit[15]扩展寄存器的bit[31:16]。72指令含义--2指令汇编格式LDR{cond}{B}Rd,AddressSTR{cond}{B}Rd,AddressLDR{cond}H|SH|SBRd,AddressSTR{cond}HRd,Address{cond}条件码助记符B、SB字节、装入字节符号扩展H、SH半字、装入半字符号扩展Address如以下所述73数据传送指令

–关于地址数据传送使用的存储器地址Address,由基址寄存器加或减一个偏移量计算形成。计算出的地址可以回写/不回写基址寄存器。计算地址可以在数据传送前或传送后进行。相对基址寄存器的偏移量,有两种指定方法,一种是指令中指定的8位无符号立即数作为偏移量,另一种是指令中指定寄存器Rm,Rm的值作为偏移量。74数据传送指令

–关于地址寻址寄存器偏移:地址

=基址

寄存器偏移立即数偏移:地址=基址

立即数常数后变址Post-indexing:modifyaddressafteruse前变址Pre-indexing:modifyaddressbeforeuse回写如果可能,更新基址寄存器75寻址方式变址模式数据基址寄存器示例回写前变址mem[base+offset]基址寄存器加上偏移LDRr0,[r1,#4]!前变址mem[base+offset]不变LDRr0,[r1,#4]后变址mem[base]基址寄存器加上偏移LDRr0,[r1],#4注:若有“!”,则将包含偏移量的地址写回到基址寄存器Rn76例子PREr0=0x00000000,r1=0x00009000,Mem32[0x00009000]=0x01010101Mem32[0x00009004]=0x02020202回写型前变址寻址:LDRr0,[r1,#0x4]!POSTr0=0x02020202,r1=0x00009004前变址寻址:LDRr0,[r1,#0x4]POSTr0=0x02020202,r1=0x00009000后变址寻址:LDRr0,[r1],#0x4POSTr0=0x01010101,r1=0x00009004数据传送指令

–应用

COPY: ADRr1,TABLE1 ;r1pointstoTABLE1 ADRr2,TABLE2 ;r2pointstoTABLE2LOOP: LDRr0,[r1] STRr0,[r2] ADDr1,r1,#4 ADDr2,r2,#4 ...TABLE1: ...TABLE2:...COPY: ADRr1,TABLE1 ;r1pointstoTABLE1 ADRr2,TABLE2 ;r2pointstoTABLE2LOOP: LDRr0,[r1],#4 STRr0,[r2],#4 ...TABLE1: ...TABLE2:...78

LDRR0,[R1,R2];先索引,R1+R2内容作地址,读字数据送R0,不回写LDRR0,[R1,R2]!;先索引,R1+R2内容作地址,读字数据送R0,;R1+R2回写R1

LDRR0,[R1,-R2];先索引,不回写,地址由R1-R2的内容指定

LDRR0,[R1],R2;后索引,R1内容作地址,读字数据送R0,;R1+R2回写R1

STRR0,[R1],#8;后索引,R0数据送以R1内容作地址的存储器单元,;R1+8回写R1

STRR0,[R1,#8];先索引,R0数据写入R1+8作地址的存储器,不回写

LDREQBR1,[R6,#5];条件执行,R6+5内容作地址,读一字节数据送;R1[7:0],R1[31:8]填0STRBR0,[R1,#4];存R0[7:0]到R1+4内容作地址的存储器,不回写79使用举例

LDRHR0,[R1-R2]!;R1-R2内容作地址,装入半字数据到R0低16位,;高16位用0扩展,地址回写R1STRHR2,[R3,#04];R3+04内容作地址,存R2中低16位,不回写

LDRSBR7,[R1],#230;R1内容作地址,装入1字节数据到R7低8位,;符号扩展,R1+230回写R1

LDRNESHR10,[R1];条件执行,R1内容作地址,装入半字数据到;R10低16位,符号扩展

STRHR1,[R0,#2]!;R1中低16位存R0+2地址中,R0+2回写R0使用举例80块数据传送指令也称为多寄存器装入/存储指令,它可以实现多个寄存器与存储器多个单元之间的数据传送。LDM指令从存储器装入数据到寄存器;STM指令保存寄存器内容到存储器。允许使用一条指令传送16个寄存器中的任何一个子集或全部寄存器,但不允许寄存器的个数为0。LDM/STM指令用于堆栈操作或块数据传送,主要用途为保护现场、块数据复制、参数传送或上下文切换。813.2.9块数据传送指令(LDM、STM)多数据传送指令

(LDM,STM)load(LDM)或

store(STM)当前可访问寄存器的任意子集

使用堆栈:maintainingfulloremptystackswhichcangrowupordownmemory上下文切换:保存或重新存储工作寄存器块拷贝:在主存储器中移动大数据块寻址Pre/PostindexingAutoincrementordecrement回写到基址寄存器Writebackthebaseregister82块数据传送指令汇编格式LDM\STM{cond}IA\IB\DA\DBRn{!},<RList>{^}LDM\STM{cond}FD\ED\FA\EASP!,<RList>{^}{cond}条件码助记符FD\ED\FA\EA寻址模式—堆栈操作IA\IB\DA\DB寻址模式—块操作Rn基址寄存器编号{!}回写选择<RList>用大括号括起来的寄存器列表{^}表示设置S位83多寄存器传送指令的寻址模式寻址模式描述起始地址结束地址Rn!IA执行后增加RnRn+4*N-4Rn+4*NIB执行前增加Rn+4Rn+4*NRn+4*NDA执行后减少Rn-4*N+4RnRn-4*NDB执行前减少Rn-4*NRn-4Rn-4*N注:!决定Rn的值是否随着传送而改变84多寄存器传送寻址模式r5r1r9’r0r9STMIAr9!,{r0,r1,r5}100016100c16101816r1r5r9STMDAr9!,{r0,r1,r5}r0r9’100016100c16101816r5r9STMDBr9!,{r0,r1,r5}r1r0r9’100016100c16101816r5r1r0r9’r9STMIBr9!,{r0,r1,r5}100016100c1610181685例子要求:保存r1~r3到内存地址0x9000~0x900c,并且更新基址寄存器r4PRE:r1=0x00000001,r2=0x00000002,r3=0x00000003,r4=0x9000执行操作:STMIAr4!,{r1,r2,r3}(执行后增加)POST:mem32[0x9000]=0x00000001mem32[0x9004]=0x00000002mem32[0x9008]=0x00000003r4=0x900c86例1:将存储器中的连续数据装载到寄存器PREmem32[0x80018]=0x03,mem32[0x80014]=0x02,mem32[0x80010]=0x01,r0=0x00080010,r1=0x00000000,r2=0x00000000,r3=0x00000000执行指令:LDMIAr0!,{r1-r3}POSTr0=0x0008001c,r1=0x00000001,r2=0x00000002,r3=0x000000030x800200x000000050x8001c0x000000040x800180x000000030x800140x000000020x800100x000000010x8000c0x00000000地址指针存储地址数据r3=0x00000000r2=0x00000000r1=0x00000000r0=0x8001087例2:完成一个存储器数据块拷贝注:r9——存放源数据的起始地址

r10——存放目标起始地址

r11——存放源结束地址

loopLDMIAr9!,{r0-r7};装载32字节并更新r9指针

STMIAr10!,{r0-r7};存储32字节并更新r10指针

CMPr9,r11;是否到达结束地址

BNEloop;不相等跳转目的源高地址低地址拷贝存储地址r9r11r1088多寄存器数据传送指令的要点多寄存器Load/Store指令会增加中断的延迟,因为ARM不会打断正在执行的指令去响应中断,而必须等到指令执行完成;一般编译器将提供一个选项以控制Load/Store指令可以传送的最大寄存器数目,以限制最大中断延迟。89堆栈操作ARM使用多寄存器Load/Store指令来完成堆栈操作;使用堆栈时,需要确定堆栈在存储空间中是向上生长递增的还是向下生长递减的;递增(“A”):堆栈向存储器地址增大方向生长。递减(“D”):堆栈向存储器地址减小方向生长。满堆栈(“F”)是指堆栈指针指向堆栈的最后一个已使用的地址或满位置;空堆栈(“E”)是指SP指向堆栈的第一个没有使用的地址或空位置;递增或递减方式的地址修改偏移量为4。90堆栈操作寻址方式寻址方式说明pop=LDMpush=STMFA满递增堆栈LDMFALDMDASTMFASTMIBFD满递减堆栈LDMFDLDMIASTMFDSTMDBEA空递增堆栈LDMEALDMDBSTMEASTMIAED空递减堆栈LDMEDLDMIBSTMEDSTMDA91LDMFDsp!,{r4-r7,pc}SP100FF1234AOBE80341010123484209753r41r514544r60r712lr9048pc9020r4100100FFr5FF1234r61234A0BEr7A0BE8034pc8034堆栈r4100r5FFr61234r7A0BElr8034ABCD8765102E16FFFF1010123484209753存储器顶SPSP100FF1234A0BE8034SPOldSP100FF1234A0BE8034ARM堆栈操作通过块传送指令来完成:STMFD

(Push) 块存储-FullDescendingstack[STMDB]LDMFD

(Pop) 块装载-FullDescendingstack[LDMIA]STMFDsp!,{r4-r7,lr}92例:把寄存器内容放入堆栈,更新sp0x800180x000000010x800140x000000020x80010Empty0x8000cEmpty0x800180x000000010x800140x000000020x800100x000000030x8000c0x00000002PRE地址数据POST地址数据SPSPPRE:r1=0x00000002,r4=0x00000003,sp=0x00080014执行指令:STMFDsp!,{r1,r4}POST:r1=0x00000002,r4=0x00000003,sp=0x0008000c93使用举例

LDMFDSP!,{R1,R2,R3};将SP指向的存储器单元多字数据,装入到;R1、R2和R3,满递减堆栈,回写SPSTMIAR0,{R0-R15};保存全部寄存器内容到R0指向的存储器单元,;R0值不变

LDMFDSP!,{R15};将SP指向的存储器单元字数据,装入到R15,;不改变CPSR,回写SP

LDMFDSP!,{R15}^;将SP指向的存储器单元字数据,装入R15,同时;将SPSR_<mode>的值送CPSR,回写SP,;只允许在特权方式使用

STMFDR13,{R0-R14}^;用户方式寄存器R0-R14的内容存入堆栈,;只允许在特权方式使用94【例3.13】如下子程序首先在分支前,保存工作寄存器R0-R7和连接寄存器R14的值到堆栈,然后BL指令分支到另外的程序,破坏了原R14的值,之后LDMED指令从堆栈出栈到工作寄存器R0-R7,将原R14连接寄存器的值出栈到R15(PC),实现了从这个子程序返回的目的。(见参考书)【例3.14】将存储器源数据缓冲区SrcBuff的8个字传送到目的数据缓冲区DstBuff。(见参考书)953.2.10单个数据交换指令(SWP)单个数据交换指令允许寄存器与存储器之间交换字节/字数据。SWP指令为字交换指令,允许读出存储器中指定地址的一个字数据,装入一个寄存器,而将另一个寄存器的内容写入存储器的同一个地址中。SWPB指令为字节交换指令,允许读出存储器中指定地址的一字节数据,装入一个寄存器的低8位,而将另一个寄存器低8位的内容写入存储器的同一个地址中。SWP和SWPB指令中,允许两个寄存器有相同的寄存器名,这样指令的功能就变成了一个寄存器与存储器确定单元之间的字/字节数据交换。96单数据交换指令

-SWP在寄存器和外部存储器之间交换字节或字读存储器和写存储器是放在一起的原子指令执行时不能中断当‘LOCK’

信号输出操作时,外部存储器管理单元被锁定,当多线程操作时使程序同步(OS支持)锁定信号量97在寄存器和存储器之间,由一次存储器读和一次存储器写组成的原子操作。完成一个字节或字的交换。语法:

SWP{<cond>}{B}Rd,Rm,[Rn]可用作信号量不能由armcc编译产生,必须使用汇编器。RmRd321temp存储器RnSWP98SWAP指令的用法PREmem32[0x9000]=0x12345678,r0=0x00000000,r1=0x11112222,r2=0x00009000执行操作:SWPr0,r1,[r2]POST:mem32[0x9000]=0x11112222,r0=0x12345678,r1=0x11112222,r2=0x00009000交换指令多用于实现操作系统中的信号量和互斥操作,该指令有修饰符B,即有字交换和字节交换两种形式;99SWP指令应用示例SpinMOVr1,=semaphoreMOVr2,#1SWPr3,r2,[r1]CMPr3,#1BEQspin注:信号量指向的单元是0或1,如果为1,则表示该服务被另一个过程使用,程序继续循环,直至为0100使用举例

SWPR1,R2,[R3];地址在R3中,读存储器内容装入R1,存R2的内容;到R3确定的存储器地址中,字交换

SWPBR3,R4,[R5];地址在R5中,装入一字节到R3,存R4[7:0];到R5确定的存储器地址中

SWPEQR1,R1,[R2];条件执行。条件成立时,将R1的内容与R2作为;地址的存储器单元的内容作字交换1013.2.11

软件中断(SWI)执行SWI指令引起软件中断陷阱被产生,这将改变处理器方式,PC被强制成固定值0x08,CPSR被存到SPSR_svc。进入软件中断陷阱时,首先将PC值保存到R14_svc中,保存的PC值被调整到跟随在SWI指令后的那一个字的地址。从管理方式返回时,使用MOVSPC,R14_svc指令,返回到调用程序断点处并恢复CPSR。SWI处理程序可以检测SWI号,从而决定采取何种操作。软件中断指令作为一种控制方法,用来实现从用户方式进入(转换)到管理方式。在其他方式也可以使用SWI指令,处理器同样进入到管理方式。语法:

SWI{<cond>}<SWInumber>102软件中断(SWI)执行的操作指令名称执行操作SWI软件中断Lr_svc=SWI指令后面的指令地址spsr_svc=cpsrpc=vectors+0x8cpsr模式=SVCcpsrI=1(屏蔽IRQ中断)103SWI中断处理程序处理软件中断的代码段称为中断处理程序(SWIHandler),中断处理程序是通过执行指令的地址获取软件中断号,指令地址是从lr计算出来的;SWI号的确定方法:

SWI_Number=<SWIinstruction>andNOT(0xff00000000)283124270Cond1111SWInumber(ignoredbyprocessor)23条件域104①只使用中断立即数传送信息SWI0;中断立即数为0SWI0x123456;中断立即数为0x123456②使用中断立即数传送中断请求类型,参数通过寄存器传送MOVR0,#34;子功能号为34SWI12;中断类型号为12③指令中24位中断立即数被忽略,由寄存器传送参数MOVR0,#12;中断类型号

MOVR1,#34;子功能号

SWI0;中断立即数将被忽略105使用举例使用举例【例3.15】用SWI指令的bit[23:0]给管理方式的代码传送信息。假定由SWI指令bit[23:8]表示中断类型号,进入管理方式后,由这个类型号转换成相应的地址偏移量,据此查找对应的中断例程入口地址。同时假定bit[7:0]作为传送给管理方式的数据。106SWI处理程序应用示例SWI_handler ;保存寄存器r0~r12和lr

STMFDsp!,{r0-r12,lr} ;readtheSWIinstructionLDRr10,[lr,#-4] ;makeofftop8bitsBICr10,r10,#0xff000000 ;r10-containstheSWInumberBLservice_routine ;returnfromSWIhandlerLDMFDsp!,{r0-r12,pc}^1073.2.12~3.2.15协处理器ARM体系结构允许使用协处理器来扩展指令集。常用的协处理器有控制片内功能的系统协处理器、用于浮点运算的ARM协处理器等。允许各生产厂商根据需要开发自己的专用协处理器,与ARM处理器配合工作。ARM协处理器有自己专用的寄存器组。

ARM全部协处理器指令只能与数据处理和数据传送有关。数据处理与传送指令有不同的指令格式108协处理器指令ARM体系支持16个协处理器在程序执行过程中,ARM执行的协处理器指令,要指定某一个协处理器进行某种操作,其他协处理器将忽略这条指令。如果相应的协处理器不存在,ARM920T产生一个未定义

温馨提示

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

评论

0/150

提交评论