版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章ARM体系结构(三)
主要内容1324ARM体系结构概述
编程模型ARM基本寻址方式ARM指令集
寻址方式是根据指令中给出的地址码字段来寻找真实操作数地址的方式。ARM处理器支持的基本寻址方式有:3.3ARM基本寻址方式寄存器寻址立即寻址寄存器移位寻址寄存器间接寻址变址寻址多寄存器寻址堆栈寻址块复制寻址相对寻址寄存器寻址所需要的值在寄存器中,指令中地址码给出的是寄存器编号,即寄存器的内容为操作数。例如指令:ADDR0,R1,R2;R0
R1+R2这条指令将2个寄存器(R1和R2)的内容相加,结果放入第3个寄存器R0中。必须注意写操作数的顺序,第1个是结果寄存器,然后是第一操作数寄存器,最后是第二操作数寄存器。立即寻址立即寻址是一种特殊的寻址方式,指令中在操作码字段后面的地址码部分不是通常意义上的操作数地址,而是操作数本身。这样的数称为立即数。例如指令:ADDR3,R3,#1
;R3
R3+1ANDR8,R7,#0xff;R8R7[7:0]第2个源操作数为一个立即数,以“#”为前缀,十六进制值以在“#”后加“0x”或“&”表示。第1条指令完成寄存器R3的内容加1,结果放回R3中。第2条指令完成R7的32位值与0FFH相“与”,结果为将R7的低8位送到R8中。寄存器移位寻址这种寻址方式是ARM指令集特有的。第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。例如指令:ADDR3,R2,R1,LSL#3;R3
R2+8×R1寄存器R1的内容逻辑左移3位,再与寄存器R2内容相加,结果放入R3中。可以采取的移位操作如有:LSL:逻辑左移(LogicalShiftLeft)。寄存器中字的低端空出的位补0。0LSR:逻辑右移(LogicalShiftRight)。寄存器中字的高端空出的位补0。0可以采取的移位操作如有:寄存器移位寻址ASR:算术右移(ArithmeticShiftRight)。算术移位的对象是带符号数,若源操作数为正数,则字的高端空出的位补0。若源操作数为负数,则字的高端空出的位补1。RRX:扩展为1的循环右移(RotateRighteXtendedby1place)。操作数右移一位,空位(位[31])用原C标志值填充。
ROR:循环右移(ROtateRight)。从字的最低端移出的位填入字的高端空出的位。C寄存器间接寻址指令中的地址码给出某一通用寄存器的编号。在被指定的寄存器中存放操作数的有效地址,而操作数则存放在存储单元中,即寄存器为地址指针。例如指令:LDRR0,[R1];R0
[R1]STRR0,[R1];R0[R1]寄存器间接寻址使用一个寄存器(基址寄存器)的值作为存储器的地址。第1条指令将寄存器R1指向的地址单元的内容加载到寄存器R0中。第2条指令将寄存器R0存入寄存器R1指向的地址单元。变址寻址变址寻址就是将基址寄存器的内容与指令中给出的位移量相加,形成操作数有效地址。变址寻址用于访问基址附近的存储单元,包括基址加偏移和基址加索引寻址。寄存器间接寻址是偏移量为0的基址加偏移寻址。基址加偏移寻址基址加索引寻址前索引寻址方式:基址需加(或减)最大4KB的偏移来计算访问的地址。例如:LDRR0,[R1,#4];R0
[R1+4]后索引寻址方式:基址不带偏移作为传送的地址,传送后自动索引。例如:LDRR0,[R1],#4;R0
[R1]
;R1
R1+4
指令指定一个基址寄存器,再指定另一个寄存器(索引),其值作为位移加到基址上形成存储器地址。例如:LDRR0,[R1,R2];R0
[R1+R2]多寄存器寻址一次可以传送几个寄存器的值。允许一条指令传送16个寄存器的任何子集(或所有16个寄存器)。例如指令:LDMIAR1,{R0,R2,R5};R0
[R1];R2[R1+4];R5[R1+8]
由于传送的数据项总是32位的字,基址R1应该字对准。这条指令将R1指向的连续存储单元的内容送到寄存器R0、R2和R5。堆栈寻址堆栈是按“先进后出”(FILO)的特定顺序进行存取的存储区。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储器区域(堆栈)。栈指针所指定的存储单元就是堆栈的栈顶。根据增长方向,堆栈可分为:向上生长:即向高地址方向生长,称为递增堆栈(AscendingStack)。向下生长:即向低地址方向生长,称为递减堆栈(DescendingStack)。
根据栈指针的指向位置,堆栈可分为:满堆栈:堆栈指针指向最后压入堆栈的有效数据项空堆栈:堆栈指针指向下一个数据项放入的空位置,这样就有4种类型的堆栈表示递增和递减的满和空堆栈的各种组合。ARM处理器支持所有这4种类型的堆栈。满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的最高地址。空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置。满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最低地址。空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空位置。堆栈寻址块复制寻址ARM支持两种不同角度的寻址机制:堆栈角度和块复制角度,两者都映射到相同的基本指令。堆栈和块拷贝角度的多寄存器加载和存储指令映射如下图。块复制角度的寻址举例,执行指令之前的基址寄存器值是R9,自动寻址之后的基址寄存器是R9’。
块复制寻址相对寻址相对寻址是变址寻址的一种变通,由程序计数器PC提供基地址。指令中的地址码字段作为位移量,两者相加后得到操作数的有效地址。位移量指出的是操作数与现行指令之间的相对位置。例如指令:BLSUBR;转移到SUBR…;返回到此SUBR…;子程序入口地址MOVPC,R14
;返回主要内容1324ARM体系结构概述
编程模型ARM基本寻址方式ARM指令集
3.4.1条件执行几乎所有的ARM指令均可包含一个可选的条件码,句法说明中以{cond}表示,只有在CPSR中的条件码标志满足指定的条件时,带条件码的指令才能执行。并使用后缀“S”来区分是否根据执行结果修改条件码标志。操作码[31:28]助记符后缀标志含义0000EQZ置位相等0001NEZ清零不等0010CS/HSC置位大于或等于(无符号>=)0011CC/LOC清零小于(无符号<)0100MIN置位负0101PLN清零正或零0110VSV置位溢出0111VCV清零未溢出1000HIC置位且Z清零大于(无符号>)1001LSC清零或Z置位小于或等于(无符号<=)1010GEN和V相同带符号>=1011LTN和V不同带符号<1100GTZ清零且N和V相同带符号>1101LEZ置位或N和V不同带符号<=1110AL任何总是(通常省略)3.4.2指令分类说明
32位ARM指令集由13种基本指令类型组成,分成4大类:3种类型的存储器访问指令:控制存储器和寄存器之间的数据传送。一种类型用于优化的灵活寻址;另一种类型用于快速上下文切换;第三种类型用于交换数据。3种类型的数据处理指令:使用片内ALU、桶形移位器和乘法器针对31个寄存器完成高速数据处理操作。4种类型的分支指令:控制程序执行流程、指令优先级以及ARM代码和Thumb代码的切换。3种类型的协处理器指令:专用于控制外部协处理器。这些指令以开放和统一的方式扩展了指令集的片外功能。
ARM存储器访问指令(1)LDR和STR——字和无符号字节字节加载是用“0”扩展到32位。LDR和STR都有如下4种可能的形式:
零偏移:Rn的值作为传送数据的地址。句法:
op{cond}{B}{T}Rd,[Rn]
前索引偏移:在数据传送之前,将偏移量加到Rn中。其结果作为传送数据的存储器地址。若使用后缀“!”,则结果写回到Rn中,且Rn不允许是R15。句法:
op{cond}{B}Rd,[Rn,Flexoffset]{!}
程序相对偏移:程序相对偏移是前索引形式的另一种版本。汇编器由PC计算偏移量,并将PC作为Rn生成前索引指令。不能使用后缀“!”。句法:op{cond}{B}Rd,label
后索引偏移:Rn的值用做传送数据的存储器地址。在数据传送后,将偏移量加到Rn中。结果写回到Rn。Rn不允许是R15。句法:op{cond}{B}{T}Rd,[Rn],Flexoffset
ARM存储器访问指令(1)LDR和STR——字和无符号字节[例子]LDR R8,[R10]
;R8
[R0]LDRNER2,[R5,#960]!
;(有条件地)R2[R5+960],R5R5+960STR R2,[R9,#consta-struc];consta-struc是常量的表达式,该
;常量值的范围为0~4095STRBR0,[R3,-R8,ASR#2];R0[R3-R8/4],存储R0的最低有效
;字节,R3和R8不变STR R5,[R7],#-8;R5[R7],R1R7-8LDR R0,localdata
;加载一个字,该字位于标号lacaldata所在地址(2)LDR和STR——半字和带符号字节
ARM存储器访问指令这些指令有4种可能的形式:零偏移、前索引偏移、程序相对偏移和后索引偏移。以同样的顺序,4种形式的句法为op{cond}typeRd,[Rn]op{cond}typeRd,[Rn,offset]{!}op{cond}typeRd,labelop{cond}typeRd,[Rn],offset其中:type必须是以下所列的其中之一:SH对带符号半字(仅LDR);H对无符号半字;SB对带符号字节(仅LDR)。label程序相对偏移表达式。
label必须是在当前指令的±255字节范围内。offset加在Rn上的偏移量。
ARM存储器访问指令(2)LDR和STR——半字和带符号字节[例子]LDREQSHR11,[R6];(有条件地)R11
[R6],加载16位半字,;带符号扩展到32位LDRHR1,[R0,#22]
;R1[R0+22],加载16位半字,零扩展到32位STRHR4,[R0,R1]!
;R4[R0+R1],存储最低的有效半字到R0+R1;地址开始的两个字节,地址写回到R0LDRSB R6,constf
;加载位于标号constf地址中的字节,带符号扩展(3)LDR和STR——双字
ARM存储器访问指令加载两个相邻的寄存器和存储两个相邻的寄存器,64位双字。这些指令有4种可能的形式:零偏移、前索引偏移、程序相对偏移、后索引偏移。以同样的顺序,4种形式的句法为op{cond}DRd,[Rn]op{cond}DRd,[Rn,offset]{!}op{cond}DRd,labelop{cond}DRd,[Rn],offset[例子]LDRD R6,[R11]LDRMID R4,[R7],R2STRD R4,[R9,#24]STRD R0,[R9,-R2]!LDREQD R8,abc4(4)LDM和STM
ARM存储器访问指令加载多个寄存器(LDM)和存储多个寄存器(STM)。可以传送R0-R15的任何组合。句法:op{cond}modeRn{!},reglist{^}其中:mode
是IA/IB/DA/DB/FD/ED/FA/EA中的一个.Rn
基址寄存器,装有传送数据的初始地址。Rn不允许是R15。!
可选后缀。若有“!”,则最后的地址写回到Rn。
reglist
加载或存储的寄存器列表,包含在括号中。^可选后缀,不允许在用户模式或系统模式下使用。若op是LDM且reglist中包含PC(R15),那么除了正常的多寄存器传送外,将SPSR也拷贝到CPSR中。这用于从异常处理返回,仅在异常模式下使用。数据传入或传出的是用户模式的寄存器,而不是当前模式的寄存器。
ARM存储器访问指令(4)LDM和STM[例子]LDMIAR8,{R0,R2,R9}STMDBR1!,{R3-R6,R11,R12}STMFDR13!,{R0,R4-R7,LR}
;寄存器进栈LDMFDR13!,{R0,R4-R7,PC}
;寄存器出栈,从子程序返回(5)PLD
ARM存储器访问指令Cache预加载。使用PLD(PreLoaD)提示存储系统从后面几条新指令所指定的存储器地址加载。存储系统可使用这种方法加速以后的存储器访问。句法:PLD[Rn{Flexoffset}][例子]PLD [R2]PLD [R15,#280]PLD [R9,#-2481]PLD [R0,#av*4];av*4必须在汇编时求值,范围为-4095-4095PLD [R0,R2]PLD [R5,R8,LSL#2](6)SWP
ARM存储器访问指令在寄存器和存储器之间进行数据交换。使用SWP来实现信号量。句法:SWP{cond}{B}Rd,Rm,[Rn]其中:B可选后缀。若有B,则交换字节;否则,交换32位字。RdARM寄存器。数据从存储器加载到Rd。
RmARM寄存器。Rm的内容存储到存储器。Rm可以与Rd相同。在这种情况下,寄存器的内容与存储器的内容进行交换。
RnARM寄存器。Rn的内容指定要进行数据交换的存储器的地址。Rn必须与Rd和Rm不同。
ARM数据处理指令数据处理类指令格式:<opcode>{<cond>}{S}{Rd},{Rn},<shifter_operand>opcode:操作码,如ADD、SUB、ORRcond:条件码S:本指令是否更新CPSR中的状态标志位Rd:目标寄存器Rn:第一个源寄存器shifter_operand:复合的源操作数,其格式:立即数 ADDR1,R2,#0x35寄存器 SUBSR3,R2,R1寄存器移位 ADDEQSR9,R5,R5,LSL#3
SUBR3,R2,R1,RORR7
ARM数据处理指令算术/逻辑运算指令
ARM数据处理指令乘法指令
MUL指令将Rm和Rs中的值相乘,并将最低有效的32位结果放到Rd中。句法:MUL{cond}{S}Rd,Rm,RsMLA指令将Rm和Rs中值相乘,再加上Rn的值,并将最低有效的32位结果放到Rd中。句法:MLA{cond}{S}Rd,Rm,Rs,RnUMULL指令将Rm和Rs中的值解释为无符号整数。该指令将这两个整数相乘,并将结果的最低有效32位放在RdLo中,最高有效32位放在RdHi中。UMLAL指令将Rm和Rs中的值解释为无符号整数。该指令将这两个整数相乘,并将64位结果加到RdHi和RdLo中的64位无符号整数上。SMULL指令将Rm和Rs中的值解释为带符号的补码整数。该指令将这两个整数相乘,并将结果的最低有效32位放在RdLo中,将最高有效32位放在RdHi中。SMLAL指令将Rm和Rs中的值解释为带符号的补码整数。该指令将这两个整数相乘,并将64位结果加到RdHi和RdLo中的64位带符号补码整数上。句法:op{cond}{S}RdLo,RdHi,Rm,Rs
前导零计数CLZ指令对Rm中值的前导零的个数进行计数,结果放到Rd中。若源寄存器全为0,则结果为32。若位[31]为1,则结果为0。句法:CLZ{cond}Rd,Rm
ARM转移指令(1)B和BLB(Branch)指令引起处理器转移到label。
句法:B{cond}label
BL(BranchandLink)指令将下一条指令的地址拷贝到R14(LR,链接寄存器),并引起转移到label。
句法:BL{cond}label
(2)BX:引起处理器转移到Rm中的地址。若Rm的位[0]为1,则指令集变换到Thumb。句法:BX{cond}Rm(3)BLX:带链接转移并可选地交换指令集。句法:BLX{cond}Rm
BLXlabel
ARM协处理器指令(1)CDP,协处理器数据操作指令句法:CDP{cond}coproc,opcode1,CRd,CRn,CRm{,opcode2}其中:coproc
指令操作的协处理器名。标准名为pn,其中n为0-15范围内的整数。opcode1协处理器特定操作码。Rd,Rn源寄存器,不允许是R15。
CRd,CRn,CRm协处理器寄存器。opcode2可选的协处理器特定操作码。(2)MCR和MCRR,将数据从ARM寄存器传送到协处理器句法:MCR{cond}coproc,opcode1,Rd,CRn,CRm{,opcode2}MCRR{cond}coproc,opcode1,Rd,Rn,CRm(3)MRC和MRRC,从协处理器传送到ARM寄存器句法:MRC{cond}coproc,opcode1,Rd,CRn,CRm{,opcode2}MRRC{cond}coproc,opcode1,Rd,Rn,CRm(4)LDC和STC,在存储器和协处理器之间传送数据。这些指令有3种可能形式:零偏移、前索引偏移、后索引偏移。相应句法为:op{cond}{L}coproc,CRd,[Rn]op{cond}{L}coproc,CRd,[Rn,#{-}offset]{!}op{cond}{L}coproc,CRd,[Rn],#{-}offset 其中:L可选后缀,指明是长整数传送。
coproc指令操作的协处理器名。
CRd用于加载或存储的协处理器寄存器。
Rn存储器基址寄存器。若指定R15,取值是当前指令地址加8。
offset表达式,其值为4的整倍数,范围在0~1020之间。
ARM协处理器指令
杂项ARM指令(1)SWI,引起软件中断。这意味着处理器模式变换为管理模式,CPSR保存到管理模式的SPSR中,执行转移到SWI向量。句法:SWI{cond}immed_24其中:immed_24为表达式,其值为0~224-1范围内的整数。(2)MRS,将CPSR或SPSR的内容传送到通用寄存器。句法:MRS{cond}Rd,psr其中:Rd目标寄存器。Rd不允许为R15。
psrCPSR或SPSR。(3)MSR,用立即数或通用寄存器的内容加载CPSR或SPSR的指定区域。句法:MSR{cond}<psr>_<fields>,#immed_8rMSR{cond}<psr>_<fields>,Rm其中:<psr>CPSR或SPSR。<fields>指定传送的区域。
immed_8r值为数字常量的表达式。常量必须对应于8位位图在32位字中循环移位偶数位后的值。
Rm源寄存器。(4)BKPT,引起处理器进入调试模式。句法:BKPTimmed_16其中:immed_16为表达式,其值为范围在0~65536内的整数。
ARM伪指令(1)ADR,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论