版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ARM及Thumb指令集ARM指令小节目录1.指令格式2.条件码3.存储器访问指令4.数据处理指令5.乘法指令6.ARM分支指令7.杂项指令8.伪指令ARM指令长度概述ARM指令长度指令集可以是以下任一种32bits长
(ARM状态)16bits长
(Thumb状态)ARM7TDMI支持3种数据类型字节
(8-bit)半字(16-bit)字(32-bit)字必须被排成4个字节边界对齐,半字必须被排列成2个字节边界对齐
ARM指令长度概述向后兼容:新版本增加指令,并保持指令向后兼容;Load-store结构*load/store–从存储器中读某个值,操作完后再将其放回存储器中只对存放在寄存器的数据进行处理对于存储器中的数据,只能使用load/store指令进行存取简单的ARM程序;文件名:TEST1.S
;功能:实现两个寄存器相加;说明:使用ARMulate软件仿真调试
AREA Example1,CODE,READONLY ;声明代码段Example1 ENTRY ;标识程序入口
CODE32 ;声明32位ARM指令START MOV R0,#0 ;设置参数
MOV R1,#10LOOP BL ADD_SUB ;调用子程序ADD_SUB B LOOP ;跳转到LOOPADD_SUB
ADDS R0,R0,R1 ;R0=R0+R1 MOV PC,LR ;子程序返回
END ;文件结束使用“;”进行注释标号顶格写实际代码段声明文件结束4.2指令集介绍
ARM指令集——指令格式
ARM是三地址指令格式,指令的基本格式如下:4.2指令集介绍ARM指令集——基本指令格式<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}
其中<>号内的项是必须的,{}号内的项是可选的。各项的说明如下:opcode:指令助记符; cond:执行条件;S:是否影响CPSR寄存器的值;Rd:目标寄存器; Rn:第1个操作数的寄存器;operand2:第2个操作数;指令语法目标寄存器(Rd)源寄存器1(Rn)源寄存器2(Rm)ADDr3,r1,r2r3r1r2例:
ARM指令的基本格式如下:4.2指令集介绍ARM指令集——第2个操作数<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}
灵活的使用第2个操作数“operand2”能够提高代码效率。它有如下的形式:#immed_8r——常数表达式;Rm——寄存器方式;Rm,shift——寄存器移位方式;4.2指令集介绍ARM指令集——第2个操作数#immed_8r——常数表达式该常数必须对应8位位图,即一个8位的常数通过循环右移偶数位得到。循环右移10位0x12000100100x00000000000x00000000000x00000000000x00000000000x00000000000x80100000000x04000001008位常数4.2指令集介绍ARM指令集——第2个操作数Rm——寄存器方式在寄存器方式下,操作数即为寄存器的数值。例如:SUB R1,R1,R24.2指令集介绍ARM指令集——第2个操作数Rm,shift——寄存器移位方式将寄存器的移位结果作为操作数(移位操作不消耗额外的时间),但Rm值保持不变,移位方法如下:操作码说明操作码说明ASR#n算术右移n位ROR#n循环右移n位LSL#n逻辑左移n位RRX带扩展的循环右移1位LSR#n逻辑右移n位TypeRsType为移位的一种类型,Rs为偏移量寄存器,低8位有效。桶形移位器ALU桶形移位器Rd结果NRmRn4.2指令集介绍桶形移位器操作助记符说明移位操作结果Y值LSL逻辑左移xLSLyx<<y#0-31orRsLSR逻辑右移xLSRy(unsigned)x>>y#1-32orRsASR算术右移xASRy(signed)x>>Y#1-32orRsROR算术左移xRORy((unsigned)x>>y|(x<<32-y))#1-32orRsRRX扩展的循环右移xRRXy(cflag<<31)|((unsigned)x>>1)none4.2指令集介绍4.2指令集介绍ARM指令集——第2个操作数LSL移位操作:0LSR移位操作:0ASR移位操作:ROR移位操作:RRX移位操作:C4.2指令集介绍ARM指令集——第2个操作数Rm,shift——寄存器移位方式例如:ADD R1,R1,R1,LSL#3 ;R1=R1+R1<<3SUB R1,R1,R2,LSRR3 ;R1=R1-R2>>R3ARM指令目录1.指令格式2.条件码3.存储器访问指令4.数据处理指令5.乘法指令6.ARM分支指令7.杂项指令8.伪指令
ARM指令的基本格式如下:4.2指令集介绍ARM指令集——条件码<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}
使用条件码“cond”可以实现高效的逻辑操作(节省跳转和条件语句),提高代码效率。所有的ARM指令都可以条件执行,而Thumb指令只有B(跳转)指令具有条件执行功能。如果指令不标明条件代码,将默认为无条件(AL)执行。操作码条件助记符标志含义0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1无符号数大于或等于0011CC/LOC=0无符号数小于0100MIN=1负数0101PLN=0正数或零0110VSV=1溢出0111VCV=0没有溢出1000HIC=1,Z=0无符号数大于1001LSC=0,Z=1无符号数小于或等于1010GEN=V有符号数大于或等于
1011LTN!=V有符号数小于
1100GTZ=0,N=V有符号数大于
1101LEZ=1,N!=V有符号数小于或等于
1110AL任何无条件执行
(指令默认条件)1111NV任何从不执行(不要使用)指令条件码表4.2指令集介绍ARM指令集——条件码C代码:If(a>b) a++;Else b++;对应的汇编代码:CMP R0,R1 ;R0(a)与R1(b)比较ADDHI R0,R0,#1;若R0>R1,则R0=R0+1ADDLS R1,R1,#1;若R0≤1,则R1=R1+1示例:ARM指令可以通过添加适当的条件码前缀来达到条件执行的目的。这样可以提高代码密度,减少分支跳转指令数目,提高性能。
CMPr3,#0CMPr3,#0
BEQskipADDNEr0,r1,r2
ADDr0,r1,r2
skip默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“S”来影响标志位。CMP不需要增加“S”就可改变相应的标志位。
loop
…
SUBSr1,r1,#1
BNEloop条件执行及标志位如果Z标志清零则跳转R1减1,并设置标志位条件码不等于(Notequal) 无符号的大于或等于无符号的小于负数(Minus)等于(Equal)溢出(Overflow)没溢出无符号的大于无符号的小于或大于正数或零小于(LessThan)大于(GreaterThan)小于等于总是执行(Always)大于等于EQNECS/HSCC/LOPLVSHILSGELTGTLEALMIVCSuffix描述Z=0C=1C=0Z=1测试的标志位N=1N=0V=1V=0C=1&Z=0C=0orZ=1N=VN!=VZ=0&N=VZ=1orN=!V下表为所有可能的条件码:注意:AL为默认状态,不需要单独指出程序状态寄存器条件位:N=
NegativeresultfromALUZ=ZeroresultfromALUC=ALUoperationCarriedoutV=ALUoperationoVerflowedQ位:仅ARM5TE/J架构支持指示饱和状态J位仅ARM5TE/J架构支持J=1:处理器处于Jazelle状态中断禁止位:I=1:禁止IRQ.F=1:禁止FIQ.TBit仅ARMxT架构支持T=0:处理器处于ARM状态T=1:处理器处于Thumb状态Mode位:处理器模式位2731NZCVQ2867IFTmode1623
815
54024fsxc
UndefinedJ条件执行示例一系列的指令都使用条件指令
if(a==0)func(1); CMPr0,#0
MOVEQr0,#1
BLEQfunc
置标志位,再使用不同的条件码
if(a==0)x=0;
if(a>0)x=1; CMPr0,#0
MOVEQr1,#0
MOVGTr1,#1
使用条件比较指令
if(a==4||a==10)x=0; CMPr0,#4
CMPNEr0,#10
MOVEQr1,#04.2指令集介绍ARM指令集——存储器访问指令
ARM处理器是典型的RISC处理器,对存储器的访问只能使用加载和存储指令实现。ARM7处理器是冯•诺依曼存储结构,RAM存储空间及I/O映射空间统一编址,除对RAM操作以外,对外围IO、程序数据的访问均要通过加载/存储指令进行。存储器访问指令分为单寄存器操作指令和多寄存器操作指令。助记符说明操作条件码位置LDRRd,addressing加载字数据Rd←[addressing],addressing索引LDR{cond}LDRBRd,addressing加载无符号字节数据Rd←[addressing],addressing索引LDR{cond}BLDRTRd,addressing以用户模式加载字数据Rd←[addressing],addressing索引LDR{cond}TLDRBTRd,addressing以用户模式加载无符号字节数据Rd←[addressing],addressing索引LDR{cond}BTLDRHRd,addressing加载无符号半字数据Rd←[addressing],addressing索引LDR{cond}HLDRSBRd,addressing加载有符号字节数据Rd←[addressing],addressing索引LDR{cond}SBLDRSHRd,addressing加载有符号半字数据
Rd←[addressing],addressing索引
LDR{cond}SHARM存储器访问指令——单寄存器加载助记符说明操作条件码位置STRRd,addressing存储字数据[addressing]←Rd,addressing索引STR{cond}STRBRd,addressing存储字节数据[addressing]←Rd,addressing索引STR{cond}BSTRTRd,addressing以用户模式存储字数据[addressing]←Rd,
addressing索引STR{cond}TSTRBTRd,addressing以用户模式存储字节数据[addressing]←Rd,addressing索引STR{cond}BTSTRHRd,addressing存储半字数据[addressing]←Rd,addressing索引STR{cond}HARM存储器访问指令——单寄存器存储
LDR/STR指令用于对内存变量的访问、内存缓冲区数据的访问、查表、外围部件的控制操作等。若使用LDR指令加载数据到PC寄存器,则实现程序跳转功能,这样也就实现了程序散转。所有单寄存器加载/存储指令可分为“字和无符号字节加载存储指令”和“半字和有符号字节加载存储指令。LDR和STR——字和无符号字节加载/存储指令
LDR指令用于从内存中读取单一字或字节数据存入寄存器中,STR指令用于将寄存器中的单一字或字节数据保存到内存。指令格式如下:ARM存储器访问指令——单寄存器存储
LDR{cond}{T} Rd,<地址>;将指定地址上的字数据读入RdSTR{cond}{T} Rd,<地址>;将Rd中的字数据存入指定地址
LDR{cond}B{T} Rd,<地址>;将指定地址上的字节数据读入RdSTR{cond}B{T} Rd,<地址>;将Rd中的字节数据存入指定地址其中,T为可选后缀。若指令有T,那么即使处理器是在特权模式下,存储系统也将访问看成是在用户模式下进行的。T在用户模式下无效,不能与前索引偏移一起使用T。ARM存储器访问指令——单寄存器存储LDR和STR——字和无符号字节加载/存储指令编码指令执行的条件码I为0时,偏移量为12位立即数,为1时,偏移量为寄存器移位P表示前/后变址U表示加/减B为1表示字节访问,为0表示字访问W表示回写为指令的寻址方式Rd为源/目标寄存器Rn为基址寄存器L用于区别加载(L为1)或存储(L为0)ARM存储器访问指令——单寄存器存储LDR和STR——字和无符号字节加载/存储指令
LDR/STR指令寻址非常灵活,它由两部分组成,其中一部分为一个基址寄存器,可以为任一个通用寄存器;另一部分为一个地址偏移量。地址偏移量有以下3种格式:立即数。立即数可以是一个无符号的数值。这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDRR1,[R0,#0x12]
;R1<-[R0+0x12]寄存器。寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDRR1,[R0,R2]
;
R1<-[R0+R2]
LDRR1,[R0,-R2];R1<-[R0-R2]寄存器及移位常数。寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDRR1,[R0,R2,LSL#2]
;R1<-[R0+R2*4]
ARM存储器访问指令——单寄存器存储LDR和STR——字和无符号字节加载/存储指令
LDR/STR指令寻址非常灵活,它由两部分组成,其中一部分为一个基址寄存器,可以为任一个通用寄存器;另一部分为一个地址偏移量。地址偏移量有以下3种格式:立即数。立即数可以是一个无符号的数值。这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDRR1,[R0,#0x12]
;R1<-[R0+0x12]寄存器。寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDRR1,[R0,R2]
;
R1<-[R0+R2]
LDRR1,[R0,-R2];R1<-[R0-R2]寄存器及移位常数。寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDRR1,[R0,R2,LSL#2]
;R1<-[R0+R2*4]
ARM存储器访问指令——单寄存器存储
从寻址方式的地址计算方法分,加载/存储指令有以下4种格式:零偏移。 如:LDRRd,[Rn]
前索引偏移。 如:LDRRd,[Rn,#0x04]!程序相对偏移。 如:LDRRd,labe1
后索引偏移。 如:LDRRd,[Rn],#-0x04注意:必须保证字数据操作的地址是32位对齐的。LDR和STR——字和无符号字节加载/存储指令LDR和STR——半字和有符号字节加载/存储指令
这类LDR/STR指令可加载有符号半字或字节,可加载/存储无符号半字。偏移量格式、寻址方式与加载/存储字和无符号字节指令相同。ARM存储器访问指令——单寄存器存储
LDR{cond}SBRd,<地址>;将指定地址上的有符号字节读入RdLDR{cond}SHRd,<地址>;将指定地址上的有符号半字读入RdLDR{cond}HRd,<地址>;将指定地址上的半字数据读入RdSTR{cond}HRd,<地址>;将Rd中的半字数据存入指定地址注意:1.有符号位半字/字节加载是指用符号位加载扩展到32位,无符号半字加载是指用零扩展到32位;2.半字读写的指定地址必须为偶数,否则将产生不可靠的结果;ARM存储器访问指令——单寄存器存储LDR和STR——半字和有符号字节加载/存储指令编码指令执行的条件码I为0时,偏移量为12位立即数,为1时,偏移量为寄存器移位P表示前/后变址U表示加/减W表示回写为指令的寻址方式Rd为源/目标寄存器Rn为基址寄存器L用于区别加载(L为1)或存储(L为0)S为1表示有符号访问,为0表示无符号访问H为1表示半字访问,为0表示字节访问LDR和STR指令应用示例:1.加载/存储字和无符号字节指令LDR R2,[R5] ;将R5指向地址的字数据存入R2STR R1,[R0,#0x04] ;将R1的数据存储到R0+0x04地址LDRB R3,[R2],#-1 ;将R2指向地址的字节数据存入R3,R2=R2-1STRB R0,[R3,-R8ASR#2];R0->[R3-R8/4],存储R0的最低有效字节2.加载/存储半字和有符号字节指令LDRSBR1,[R0,R3] ;将R0+R3地址上的字节数据存入R1,
;高24位用符号扩展LDRHR6,[R2],#2 ;将R2指向地址的半字数据存入R6,高16位用0扩展
;读出后,R2=R2+2STRHR1,[R0,#2]! ;将R1的半字数据保存到R0+2地址,
;只修改低2字节数据,然后R0=R0+2ARM存储器访问指令——单寄存器存储练习STRR1,[R2,R5]!LDRR5,[R3,#-0X03]STREQR4[R0,R4,LSLR5]STREQR4[R6],#-0X08LDR
R0,[R2]!,-R6LDRNER4,R5,[R3,R6]LDRR4,STARTLDRR1,[R0]!LDR[SP,#-0X04]STRR1,START;(必须保证START处可以存贮数据)LDRPC,R5LDRPC,[R5]
半字和字节命令STRBR5,[SP,R3]LDRBR0,[R2],-R5,LSL,#0X02LDRBPC,[R5]STRBR0,[R15,#-0X02]!LDRHNER3,[R5,R8]LDRHR6,[R15,#-0X20]!STRHR0,[R4,R2,LSL#0X02]STRHR0,[PC,#0X08]有符号半字和有符号字节命令LDRSHR5,[R3-R6]LDRSBR0,[R4],#0X0FFLSRSHR15,[R0-R6]LSRSBR5,[R4,0X101]LDRNESHR6,[SP,#0X06]!STRSHR6,[R6]T后缀指令LDRTR5,[R6,R7]LDRBTR3,[R7],R0STRBTR0,R2,LSL#0X01STRTR7,[R3,#0X02]!LDRTR5,[R7],R3,LSL#0X040SDRTR5,R6,LSL#0X03LDRTR6,START目标寄存器器和基址寄存器是同一寄存器LDRR4,[R4,R3,LSL#2]LDRR4,[R4,R3,LSL#2]!LDRR4,[R4],R3,LSL#2LDRR4,[R3,R4,LSL#2]!STRR4,[R4,R3,LSL#2]!STRR4,[R4,R3,LSL#2]使用R15时的数据传送LDRR15,[R5]LDRR6,[R15]LDRR7,[R15,R7]!STRR15,[R7,R1]STRR0,[R15]STRR0,[R15,R8]STRR0,[R15,#0X4]!助记符说明操作条件码位置LDM{mode}Rn{!},reglist多寄存器加载reglist←[Rn...],Rn回写等LDM{cond}{mode}STM{mode}Rn{!},reglist多寄存器存储[Rn...]←reglist,Rn回写等STM{cond}{mode}
ARM存储器访问指令——多寄存器存取多寄存器加载/存储指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。LDM为加载多个寄存器;STM为存储多个寄存器。允许一条指令传送16个寄存器的任何子集或所有寄存器。它们主要用于现场保护、数据复制、常数传递等。ARM存储器访问指令——多寄存器存取多寄存器加载/存储指令格式如下:LDM{cond}<模式>Rn{!},reglist{^}STM{cond}<模式>Rn{!},reglist{^}cond:指令执行的条件;模式:控制地址的增长方式,一共有8种模式;!:表示在操作结束后,将最后的地址写回Rn中;reglist
:表示寄存器列表,可以包含多个寄存器,它们使用“,”隔开,如{R1,R2,R6-R9},寄存器由小到大排列;^:可选后缀。允许在用户模式或系统模式下使用。它有以下两个功能:1)若op是LDM且寄存器列表包含R15时,那么除了正常的多寄存器传送外,还将SPSR也复制到CPSR中。这用于异常处理返回,仅在异常模式下使用。2)数据传入或传出的是用户模式下的寄存器,而不是当前模式的寄存器。ARM存储器访问指令——多寄存器存取LDM和STM——多寄存器加载/存储指令编码指令执行的条件码S对应于指令中的”^”符号P表示前/后变址U表示加/减W表示回写寄存器列表Rn为基址寄存器L用于区别加载(L为1)或存储(L为0)ARM存储器访问指令——多寄存器存取多寄存器加载/存储指令的8种模式如下表所示,右边四种为堆栈操作、左边四种为数据传送操作。模式说明模式说明IA每次传送后地址加4FD满递减堆栈IB每次传送前地址加4ED空递减堆栈DA每次传送后地址减4FA满递增堆栈DB每次传送前地址减4EA空递增堆栈数据块传送操作堆栈操作进行数据复制时,先设置好源数据指针和目标指针,然后使用块拷贝寻址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB进行读取和存储。进行堆栈操作操作时,要先设置堆栈指针(SP),然后使用堆栈寻址指令STMFD/LDMFD、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA实现堆栈操作。ARM存储器访问指令——多寄存器存取数据块传送指令操作过程如右图所示,其中R1为指令执行前的基址寄存器,R1’则为指令执行后的基址寄存器。R5R6R7R1R1’指令STMIAR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R1R1’指令STMDAR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R1R1’指令STMIBR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R1’R1指令STMDBR1!,{R5-R7}4008H4004H4000H4014H4010H400CHARM存储器访问指令——多寄存器存取数据块传送存储堆栈操作压栈说明数据块传送加载堆栈操作出栈说明STMDASTMED空递减LDMDALDMFA满递减STMIASTMEA空递增LDMIALDMFD满递增STMDBSTMFD满递减LDMDBLDMEA空递减STMIBSTMFA满递增LDMIBLDMED空递增;使用数据块传送指令进行堆栈操作STMDA R0!,{R5-R6}...LDMIB R0!,{R5-R6};使用堆栈指令进行堆栈操作STMED R13!,{R5-R6}...LDMED R13!,{R5-R6}两段代码的执行结果是一样的,但是使用堆栈指令的压栈和出栈操作编程很简单(只要前后一致即可),而使用数据块指令进行压栈和出栈操作则需要考虑空与满、加与减对应的问题。堆栈操作(详见“4.1寻址方式堆栈寻址”)和数据块传送指令类似,也有4种模式,它们之间的关系如下表所示:堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出”。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种:向上生长:向高地址方向生长,称为递增堆栈向下生长:向低地址方向生长,称为递减堆栈4.1ARM处理器寻址方式寻址方式分类——堆栈寻址4.1ARM处理器寻址方式寻址方式分类——堆栈寻址栈底栈顶栈区SP堆栈存储区栈顶栈底栈区SP向下增长向上增长0x123456780x12345678堆栈压栈堆栈压栈栈顶SP栈顶SP栈底空堆栈栈底满堆栈堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈。4.1ARM处理器寻址方式寻址方式分类——堆栈寻址0x123456780x12345678栈顶SP0x12345678栈顶SP压栈压栈所以可以组合出四种类型的堆栈方式:满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等;空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等;满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等;空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。4.1ARM处理器寻址方式寻址方式分类——堆栈寻址LDMIAR4,{R0,R1,R2,R3,R5}数据块传送指令STMFDR13!,{R0,R4-R6,R13}LDMIDR4,{R0,R1,R2,R3,R4,R6 }LDMFDSP!,{R12,R15}LDMFDSP!,{R12,R15}^STMIDR0,{R0-R5}STMIAR1,{R0-R5}助记符说明操作条件码位置SWPRd,Rm,Rn寄存器和存储器字数据交换Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond}SWPBRd,Rm,Rn寄存器和存储器字节数据交换Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond}BARM存储器访问指令——寄存器和存储器交换指令
SWP指令用于将一个内存单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元中。使用SWP可实现信号量操作。指令格式如下:SWP{cond}{B}Rd,Rm,[Rn]
其中,B为可选后缀,若有B,则交换字节,否则交换32位字;Rd用于保存从存储器中读入的数据;Rm的数据用于存储到存储器中,若Rm与Rd相同,则为寄存器与存储器内容进行互换;Rn为要进行数据交换的存储器地址,Rn不能与Rd和Rm相同。ARM存储器访问指令——寄存器和存储器交换指令SWP和SWPB——寄存器和存储器交换指令编码指令执行的条件码B用于区别无符号字节(B为1)或字(B为0)Rm源寄存器Rd目标寄存器Rn为基址寄存器SWP指令应用示例:SWP R1,R1,[R0] ;将R1的内容与R0指向的存储单元的内容进行互换SWPB R1,R2,[R0] ;将R0指向的存储单元低字节数据读取到R1中
;(高24位清零),并将R2的内容写入到该内存单元中
;(最低字节有效)复习单寄存器数据传送
LDR STR WordLDRB STRB ByteLDRH STRH HalfwordLDRSB 带符号的byteloadLDRSH 带符号的halfwordload存储器系统必须支持所有访问宽度语法:
LDR{<cond>}{<size>}Rd,<address>STR{<cond>}{<size>}Rd,<address>e.g.LDREQB地址访问LDR/STR访问的地址由基址寄存器加上偏移量来产生。针对word和无符号byte的访问,偏移量可以是:一个无符号12-bit立即数(如0-4095bytes).
LDRr0,[r1,#8]一个寄存器,或再加上移位(由立即数指定)
LDRr0,[r1,r2]
LDRr0,[r1,r2,LSL#2]可以是从基址寄存器上加或减去偏移量:
LDRr0,[r1,#-8]
LDRr0,[r1,-r2]
LDRr0,[r1,-r2,LSL#2]对于halfword和带符号的halfword/byte,偏移量可以是:一个无符号8bit立即数(如0-255bytes).一个寄存器(不能偏移)。可选择采用pre-indexed或post-indexed方式寻址0x50x5r10x200基址
寄存器0x200r00x5源寄存器
forSTR偏移量120x20cr10x200原基址
寄存器0x200r00x5源寄存器
forSTR偏移量120x20cr10x20c更新
基址寄存器通过
STRr0,[r1,#12]!来自动更新基址寄存器PreorPostIndexed寻址?
Pre-indexed:STRr0,[r1,#12]
Post-indexed:STRr0,[r1],#12LDM/STM指令允许一次传送1到16个寄存器到/从存储器中。寄存器传送顺序不能被指定最小数字的寄存器总是被传送到/从存储器的最低地址上。
LDMIA r10,{r0,r1,r4}基址寄存器指定存储器访问开始的地址
块传送指令针对下列情况很有效:从存储器中搬运一块数据保存或恢复堆栈中的内容如果是慢速存储器,会影响中断响应时间块数据传送r1r4r0r10地址增加LDM/STM操作语法:<LDM|STM>{<cond>}<addressing_mode>Rb{!},<寄存器list>4种寻址操作:
LDMIA/STMIA
IncrementAfter(先操作,后增加)
LDMIB/STMIB
IncrementBefore(先增加,后操作)
LDMDA/STMDA
DecrementAfter(先操作,后递减)
LDMDB/STMDB
DecrementBefore(先递减,后操作)IAr1地址增加r4r0r1r4r0r1r4r0r1r4r0r10IBDADBLDMxxr10,{r0,r1,r4}STMxxr10,{r0,r1,r4}基址寄存器(Rb)LDMFDsp!,{r4-r7,pc}SP100FF1234AOBE80341010123484209753r41r514544r60r712lr9048pc9020r4100100FFr5FF1234r61234A0BEr7A0BE8034pc8034堆栈r4100r5FFr61234r7A0BElr8034ABCD8765102E16FFFF1010123484209753存储器顶SPSP100FF1234A0BE8034SPOldSP100FF1234A0BE8034ARM堆栈操作通过块传送指令来完成:STMFD
(Push) 块存储-FullDescendingstack[STMDB]LDMFD
(Pop) 块装载-FullDescendingstack[LDMIA]STMFDsp!,{r4-r7,lr}在寄存器和存储器之间,由一次存储器读和一次存储器写组成的原子操作。完成一个字节或字的交换。语法:SWP{<cond>}{B}Rd,Rm,[Rn]RmRd321temp存储器RnSWP4.2指令集介绍ARM指令集——分支指令在ARM中有两种方式可以实现程序的跳转,一种是使用分支指令直接跳转,另一种则是直接向PC寄存器赋值实现跳转。分支指令有以下三种:分支指令B;带链接的分支指令BL;带状态切换的分支指令BX。ARM分支指令——指令编码分支指令B/BL指令编码格式指令执行的条件码L区别B指令(L为0)和BL指令(L为1)24位有符号立即数(偏移量)分支指令BX指令编码格式指令执行的条件码Rm目标地址寄存器,该寄存器装载跳转地址助记符说明操作条件码位置Blabel分支指令PC←labelB{cond}BLlabel带链接的分支指令LR←PC-4,PC←labelBL{cond}BXRm带状态切换的分支指令PC←Rm,切换处理器状态BX{cond}ARM指令——分支指令助记符说明操作条件码位置Blabel分支指令PC←labelB{cond}BLlabel带链接的分支指令LR←PC-4,PC←labelBL{cond}BXRm带状态切换的分支指令PC←Rm,切换处理器状态BX{cond}ARM指令——分支指令分支指令——B指令,该指令跳转范围限制在当前指令的±32M字节地址内(ARM指令为字对齐,最低2位地址固定为0)。指令格式如下:B{cond}Label
应用示例:
B WAITA ;跳转到WAITA标号处
B 0x1234 ;跳转到绝对地址0x1234处BLLabelxxxxxxLabelxxxMOVPC,LRAddr1Addr2xxxxxxLRPC助记符说明操作条件码位置Blabel分支指令PC←labelB{cond}BLlabel带链接的分支指令LR←PC-4,PC←labelBL{cond}BXRm带状态切换的分支指令PC←Rm,切换处理器状态BX{cond}ARM指令——分支指令带链接的分支指令——BL指令适用于子程序调用,使用该指令后,下一条指令的地址被拷贝到R14(即LR)连接寄存器中,然后跳转到指定地址运行程序。跳转范围限制在当前指令的±32M字节地址内。指令格式如下:BL{cond}LabelAddr1LabelAddr2Addr21.当程序执行到BL跳转指令时,硬件将下一条指令的地址Addr2装入LR寄存器,并把跳转地址装入程序计数器(PC)2.程序跳转到目标地址Label继续执行,当子程序执行结束后,将LR寄存器内容存入PC,返回调用函数继续执行应用示例(调用子程序):
BL Label 助记符说明操作条件码位置Blabel分支指令PC←labelB{cond}BLlabel带链接的分支指令LR←PC-4,PC←labelBL{cond}BXRm带状态切换的分支指令PC←Rm,切换处理器状态BX{cond}ARM指令——分支指令带状态切换的分支指令——BX指令,该指令可以根据跳转地址(Rm)的最低位来切换处理器状态。其跳转范围限制在当前指令的±32M字节地址内(ARM指令为字对齐,最低2位地址固定为0)。指令格式如下:BX{cond}Rm跳转地址Rm[0]跳转后CPSR标志T位处理器状态00ARM11Thumb助记符说明操作条件码位置Blabel分支指令PC←labelB{cond}BLlabel带链接的分支指令LR←PC-4,PC←labelBL{cond}BXRm带状态切换的分支指令PC←Rm,切换处理器状态BX{cond}ARM指令——分支指令带状态切换的分支指令——BX指令,该指令可以根据跳转地址(Rm)的最低位来切换处理器状态。其跳转范围限制在当前指令的±32M字节地址内(ARM指令为字对齐,最低2位地址固定为0)。Rm的位[0]不用作地址的一部分。若Rm的位[0]为1,则指令将CPSR中的标志T置位,且将目标地址的代码解释为Thumb代码;若Rm的位[0]为0,则Rm的位[1]就不能为1
。指令格式如下:BX{cond}Rm应用示例:
ADRLR0,ThumbFun+1;将Thumb程序的入口地址加1存入R0BXR0 ;跳转到R0指定的地址,
;并根据R0的最低位来切换处理器状态桶型移位器DestinationCF0DestinationCFLSL:LogicalLeftShiftASR:ArithmeticRightShift(无符号数)乘2除2,并保留符号位DestinationCF...0DestinationCFLSR:LogicalShiftRightROR:RotateRight(无符号数)除2位轮换DestinationRRX:RotateRightExtended位轮换,从CF到MSB都参与操作CF寄存器,可选择是否增加移位操作.移位值可以是:5bit无符号整数放在另一个寄存器的低字节用于常数乘法
立即数8bit,大小范围0-255。右移偶数位允许直接加载32-bit常数到寄存器中。结果操作数1Barrel
Shifter操作数2ALU桶型移位器:
第二个操作数没有任何一条ARM指令可包括一个32bit的立即数所有的ARM指令都是32bits固定长度数据处理指令格式中,第二个操作数有12位4bit移位值(0-15)乘于2,得到一个范围在0-30,步长为2的移位值。记住一条准则:“最后8位一定要移动偶数位”.07118immed_8Shifter
RORrotx2QuickQuiz:
0xe3a004ff
MOVr0,#???立即数(1)Examples:下列命令中,汇编器把立即数转换为移位操作:MOVr0,#4096 ;uses0x40ror26ADDr1,r2,#0xFF0000 ;uses0xFFror16也可使用MVN来进行位反转:MOVr0,#0xFFFFFFFF ;assemblestoMVNr0,#0立即数不能使用上述方法产生,否则将导致错误。031ror#0range0-0xff000000step0x01000000ror#8range0-0x000000ffstep0x00000001range0-0x000003fcstep0x00000004ror#30000000000000000000000000000000000000000000000000000000000000000000000000立即数(2)为允许装载大常数,汇编器提供了一条伪指令:LDRrd,=const它可能汇编成下列指令:MOVorMVN。
或LDR
指令,从数据池(Literalpools)读取常数。ForexampleLDRr0,=0xFF
=>
MOVr0,#0xFFLDRr0,=0x55555555
=>
LDRr0,[PC,#Imm12]
…
…
DCD0x55555555建议把常数装载到寄存器中时一律使用该伪指令。装载32bit常数测验#11.写一条ARM指令,分别完成下列操作: a)r0=16 b)r0=r1/16 (带符号的数字) c)r1=r2*3 d)r0=-r02.下面哪些立即数是数据处理指令中有效的数据? a)0x00AB0000b)0x0000FFFFc)0xF000000F d)0x08000012e)0x00001f80f)0xFFFFFFFF3.BIC指令做什么用?4.为什么ARM处理器增加了一条RSB指令?StartStopr0=r1
?r0>r1
?r0=r0-r1r1=r1-r0YesNoYesNo你只需要使用CMP、SUB和B指令。充分使用条件执行!大家可以尝试计算2109和4161的GCD
AREAmyarea,CODE ENTRY MOVr0,#9 MOVr1,#15start ;yourcodeherestop Bstop END测验#2-GCD新建一个‘ARMExecutableImage’项目新建一个text文件另存为“gcd.s”加入到项目中Build并执行乘法语法:MUL{<cond>}{S}Rd,Rm,Rs Rd=Rm*RsMLA{<cond>}{S}Rd,Rm,Rs,Rn Rd=(Rm*Rs)+Rn[U|S]MULL{<cond>}{S} RdLo,RdHi,Rm,Rs RdHi,RdLo:=Rm*Rs[U|S]MLAL{<cond>}{S}RdLo,RdHi,Rm,Rs RdHi,RdLo:=(Rm*Rs)+RdHi,RdLo占用的周期数基本MUL指令ARM7TDMI上为2-5周期StrongARM/XScale上为1-3周期ARM9E/ARM102xE上为2周期ARM9TDMI比ARM7TDMI多1周期累加再多1周期(不针对9E,尽管结果延迟多于1周期)对于“long”型数据,多1周期以上均为一般规则,确切细节查看相应手册。软件中断(SWI)产生一个异常陷阱,跳转到SWI硬件向量。SWI处理程序可以检测SWI号,从而决定采取何种操作。通过SWI机制,运行在用户模式下的应用程序,可请求操作系统执行一系列特权操作。语法:
SWI{<cond>}<SWInumber>283124270
Cond1111SWInumber(ignoredbyprocessor)23条件域PSR传送指令MRS和MSR允许传送CPSR/SPSR中的内容到/从一个通用寄存器中。语法:
MRS{<cond>}Rd,<psr>;Rd=<psr>
MSR{<cond>}<psr[_fields]>,Rm;<psr[_fields]>=Rm在这里:<psr>=CPSRorSPSR[_fields]=‘fsxc’的任意组合也允许送一个立即数到
psr_fields
MSR{<cond>}<psr_fields>,#Immediate用户模式下,所有位均可以被读取,但只有条件标志位(_f)可被写。2731NZCVQ2867IFTmode1623
815
54024fsxc
UndefinedJ协处理器指令ARM体系支持16个协处理器针对每个协处理器的指令占用ARM指令集中的固定部分如果相应的协处理器不存在,将发生一个未定义指令异常。这有三种协处理器指令协处理器数据处理指令CDP:初始化协处理器数据处理操作协处理器寄存器传送指令MRC:从协处理器寄存器移到ARM寄存器MCR:从ARM寄存器移到协处理器寄存器协处理器存储器传送指令LDC:从存储器装载到协处理器寄存器STC:从协处理器寄存器存储到存储器测试#41.写几条ARM指令,使能IRQ中断2.下列ARM指令将做什么? a)
LDRHr0,[r1,#6] b)
LDRr0,=0x9993.在装载或存储指令中,“!”表示什么?4.当执行SWI指令时,会发生什么?5.SWP指令的优势是什么?议程
ARM指令集Thumb指令集
v5TE体系结构扩展015310ADDSr2,r2,#1ADDr2,#132-bitARM指令16-bitThumb指令对于由编译器产生的大部分指令:没有条件执行源、目的寄存器必须相同仅能使用低寄存器常数大小有限制不能使用在线移位器ThumbThumb是16-bit指令集代码密度优化(总代码大小约为ARM指令的65%)使用窄总线存储器时可以大大提高性能。是ARM指令集的一个子集。核存在一个执行状态–Thumb状态ARM和Thumb之间切换使用BX指令使用BranchExchange
指令来完成InterworkingBXRn
;Thumb状态下的Bx指令BX<condition>Rn
;ARM状态下的Bx指令也可以只是执行一个绝对跳转,无须状态更换。ARM/Thumb交互工作RnBX跳转的地址31013101ARM/Thumb选择0-ARM状态1-Thumb状态0写Thumb汇编程序Thumb不是一个“好”
指令集!最好用编译器来产生约束并不一致代码处理通常优于ARM指令更多细节,参看:ARM“ArchitectureReferenceManual”ChaptersA6和A7议程
ARM指令集 Thumb指令集v5TE体系结构扩展v5TE结构v5TE体系包括全部的v4TARM和Thumb指令集,还有:更支持interworking同时支持ARM/Thumb状态Breakpoint指令(ARM和Thumb)CLZ(CountLeadingZeros)指令扩展协处理器指令-MCR2等等支持饱和处理封装的带符号的半字乘法指令双字装载/存储指令Cache预装载指令双字协处理器传送指令-MCRR/MRRC你采用的处理器是哪种结构?处理器核 结构体系
7TDMI&9TDMI v4T 9E-Srev1 v5TE 926EJ-S/1026EJ-S v5TEJ 1020E v5TE StrongARM v4 XScaleMicroarchitecture v5TE前导零计数指令CLZ{cond}Rd,Rm计算寄存器中的值有多少个前导0源寄存器从最高位开始计算。1个周期完成 (ARM9E-S/ARM102x)如果没有任何一位被置位,结果是32;如果bit31被置位,结果为0。Rm左移Rd位即可标准化Rm带符号的标准化需要额外的1个周期0000001011101101...0R0=CLZR1,R00x6R1=1011101101000000...0Rm=MOVR0,R0LSLR1EORR1,R0,R0,LSL#1CLZR1,R1MOVR0,R0,LSLR1扩展协处理器指令CDP2,LDC2,STC2,MCR2,MRC2新格式的标准协处理器指令为协处理器设计人员提供了附加的操作码空间。同样是无条件执行的TRmRsBTBWoption16161616321632/6432/64Rd(RdHi,RdLo)Rn(RdHi,RdLo)新的有符号乘法操作SMULxy{cond}Rd,Rm,RsSMULWy{cond}Rd,Rm,RsSMLAxy{cond}Rd,Rm,Rs,RnSMLAWy{cond}Rd,Rm,Rs,RnSMLALxy{cond}RdLo,RdHi,Rm,RsSMLA
指令影响标志位Qx,y用于选择寄存器的高一半和低一半W
用于选择48位结果的高32位
不影响NZCV(没有‘S’位)1)写一段汇编代码‘qtest’测试标志位Q并清零。源文件模板在文件‘asm\dsp.s’中给出返回根据标志位Q的值2)写一段汇编主程序,累加16位有符号数组的所有元素的平方。inttotal=0;for(n=0;n<64;n++)total+=x[n]*x[n];取值指令
使用LDRH平方累加指令使用SMLABB3)是否存在互锁?4)使用AXD检查Q标志位(通过改变cpsr模式为E-PSR)5)在循环后面增加一个
BL
调用qtest并检查返回值6)专家题:
改用LDR,每次取两个值7)专家题:
修改代码,使用64位累加器测试#5-DSPpowercalculationxx[0]x[1]x[2]x[3]x[4]x[63]r0x[62]x[5]
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重庆三峡学院《实变函数与泛函分析》2021-2022学年第一学期期末试卷
- 重庆人文科技学院《羽毛球》2022-2023学年第一学期期末试卷
- 重庆人文科技学院《宋元文学》2022-2023学年第一学期期末试卷
- 重庆人文科技学院《护理研究》2023-2024学年第一学期期末试卷
- 重庆人文科技学院《高级程序设计语言》2021-2022学年期末试卷
- 重庆三峡学院《机械制造技术》2021-2022学年第一学期期末试卷
- 重庆三峡学院《大学物理学下》2021-2022学年第一学期期末试卷
- 重庆人文科技学院《中学生心理健康教育》2022-2023学年第一学期期末试卷
- 重庆人文科技学院《数据存储安全与微机系统运维》2022-2023学年期末试卷
- 重庆人文科技学院《设计应用文写作》2023-2024学年第一学期期末试卷
- 【初中道法】爱护身体+课件-2024-2025学年统编版(2024)道德与法治七年级上
- 《品牌推广策划案N》课件
- 2024-2030年全球及中国睡眠无创呼吸机行业需求形势及应用前景预测报告
- 从业人员健康管理管理制度
- 2024年医疗器械经营质量管理规范培训课件
- 景区旅游安全风险评估报告
- GB/T 36187-2024冷冻鱼糜
- 22G101三维彩色立体图集
- 建筑施工安全生产治本攻坚三年行动方案(2024-2026年)
- DL-T 1476-2023 电力安全工器具预防性试验规程
- 国家开放大学《心理健康教育》形考任务1-9参考答案
评论
0/150
提交评论