好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

ARM指令集详解.docx

28页
  • 卖家[上传人]:公****
  • 文档编号:514858725
  • 上传时间:2023-11-15
  • 文档格式:DOCX
  • 文档大小:79KB
  • / 28 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 好东西,说得非常详细的要做底层的可以看看ARM 指令集详解ARM可以用两套指令集:ARM指令集和Thumb指令集本文介绍ARM指令集在介绍ARM指令集之前,先介绍指令的格式1 指令格式(1)基本格式{}{S} ,{,}其中,◊内的项是必须的,{}内的项是可选的,如〈opcode〉是指令助记符,是必须的,而{〈cond〉}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)opcode 指令助记符,如LDR, STR等cond 执行条件,如EQ,NE等S 是否影响CPSR寄存器的值,书写时影响CPSR,否则不影响Rd 目标寄存器Rn 第一个操作数的寄存器operand2 第二个操作数指令格式举例如下:LDR R0,[R1];读取R1地址上的存储器单元内容,执行条件ALBEQ DATAEVEN ;跳转指令,执行条件EQ,即相等跳转到DATAEVENADDS R1,R1,#1 ;加法指令,R1 + 1=R1影响CPSR寄存器,带有SSUBNES Rl,Rl,#0xD;条件执行减法运算(NE),R1-0xD=>R1,影响CPSR寄存器,带有S(2)第2个操作数在ARM指令中,灵活的使用第2个操作数能提高代码效率,第2个操作数的形式如下:#immed_8r常数表达式,该常数必须对应8 位位图,即常数是由一个8 位的常数循环移位偶数位得到。

      合法常量0x3FC、0、OxFOOOOOOO、200、OxFOOOOOOl 等都是合法常量非法常量OxlFE、511、OxFFFF、0x1010、0xF0000010 等都是非法常量常数表达式应用举例如下:MOV R0,#1 ;R0=1AND Rl,R2,#0x0F ;R2 与 OxOF,结果保存在 R1LDR RO, [Rl],#-4 ;读取R1地址上的存储器单元内容,且Rl=Rl—4Rm寄存器方式,在寄存器方式下操作数即为寄存器的数值寄存器方式应用举例:SUB R1, R1, R2 ; R1-R2=〉R1MOV PC, RO ; PC=RO,程序跳转到指定地址LDR RO, [R1], -R2 ;读取R1地址上的存储器单元内容并存入RO,且R1=R1-R2Rm, shift寄存器移位方式将寄存器的移位结果作为操作数,但RM值保存不变,移位方法如下:ASR #n 算术右移n位(lWnW32)LSL #n 逻辑左移n位(lWnW31)LSR #n 逻辑左移n位(lWnW32)ROR #n 循环右移n位(lWnW31)RRX 带扩展的循环右移1位type Rs 其中,type为ASR, LSL,和ROR中的一种;Rs偏移量寄存器,低8位有效, 若其值大于或等于32,则第2个操作数的结果为0 (ASR、ROR例外)。

      寄存器偏移方式应用举例:ADD R1,R1,R1,LSL #3 ;R1=R1*9SUB R1,R1,R2,LSR#2 ;R1=R1-R2*4R15为处理器的程序计数器PC, 一般不要对其进行操作,而且有些指令是不允许使用R15, 如UMULL指令3)条件码使用指令条件码,可实现高效的逻辑操作,提高代码效率表A-1给出条件码表表A-1 条件码表条件码助记符标志含史EQ1= 1相等KEZ= 0不祐等C=L无符号数大于咸等于CC/LOE=0无符号敷小于MIN=LFL1T=O正数或耍VSV=L溢出YEv=o授肯溢出HZC=L , 2=0无符号数大于LS匚二0, Z=1无咼号数木于或等于创y=v带符号数大于或等干LT帑咼号数杏于GTz=oj u=y带符号数大于LEZ=L , IT! =V带符号数小于或等于AL任何无靈件执行(指逐默辽条件)对于Thumb指令集,只有B指令具有条件码执行功能,此指令条件码同表A-?,但如果为 无条件执行时,条件码助记符“ AL ”不能在指令中书写条件码应用举例如下:比较两个值大小,并进行相应加1处理,C代码为:if (a〉b) a++ ;else b++ ;对应的ARM指令如下。

      其中RO为a,R1为bCMP RO,R1 ; RO 与 R1 比较ADDHI RO,RO,#1 ;若 RO〉R1,则 RO=RO+1ADDLS R1,R1,#1 ;若 RO<=R1,则 R1=R1+1若两个条件均成立,则将这两个数值相加,C代码为:If((a!=1O)&&(b!=2O)) a=a+b;对应的ARM指令如下,其中RO为a,R1为bCMP RO,#1O ;比较RO是否为1OCMPNE R1,#2O ;若RO不为1O,则比较R1是否2OADDNE RO,RO,R1 ;若 RO 不为 1O 且 R1 不为 2O,指令执行,RO=RO+R12 ARM 存储器访问指令ARM处理是加载/存储体系结构的典型的RISC处理器,对存储器的访问只能使用加载和 存储指令实现ARM的加载/存储指令是可以实现字、半字、无符/有符字节操作;批量加载/存储指令可实 现一条指令加载/存储多个寄存器的内容,大大提高效率;SWP指令是一条寄存器和存储器内容交换的指 令,可用于信号量操作等ARM处理器是冯?诺依曼存储结构,程序空间、RAM空间及IO映射空间统一编 址,除对对RAM操作以外,对外围IO、程序数据的访问均要通过加载/存储指令进行。

      表A-2给出ARM存 储访问指令表表A-2 ARM存储访问指令表说明操作条件码位置LDR Ful, adilressing加我字数据Rd*- [alirezsing],寻址索即LIlJl{cCilLil}LORE Ed, ad.dressing:加载无符字节数据[adirezEing],寻址隶引LDS-icoiidlBLDRT Rd j addressing旦用户模式加载宇数据Ld*- [adiressinglj 寻址素引LDlUu 皿 d}TLilKET Rd j ad'lr essi ng应用戶模式加载无符昌字數据Rd*- [aliressing],LDE{eond}BTLDRH Rd j iddraEsiiig加載孟苻半字数齬[addiaLsing],寻址索引LDH-icoiidlHRdj addressing加载有符字节数据Hd*- [addressing] j 寻址素引LDH-[=™d}SELIHlSH R«1 j a-lilr essi ng加载有符半字敷据[adlressing],,寻址索EILDE{dond} SHSTR Rij addressing[aiiressing]■*-盟寻址索引STLicoitd}ST SI Rd i addressing存储字节数据[alireasing]阴寻址素引m-[=ond}B5TRT Rd i adireEEirLg耳用戶模式存储字数据[alir essi ng] ■*-£ 山.吁址索■;: \STE{coitd}TSRTBT Rdj addressing成用户模式存请字节数据[adiresging]「肮,寻址隶引^TLicondl BTSTKH Rd j addressing存構半宇数据[address寻址素引STL-[cond}HLIlM {mci de} Jjl{! }# re glist扭虽簡存罂)加莪T e gl 1 E 七4 L Rtl…h Rtl回•存黑LDM {cond.} {more}STM {mode? Ruf! rtglizt曲量倚存器〕存储[Rn---j'H-regliEtJ Rn 回存等STMicond} {more}SWF Ri, Ein, Bn寄存辭和存储黑字数据女揺[Edj,[血]~[帥]血#Rd或Em)OPE Rd/Rm.En 谒存器和存储器字节數I眈换pdRd]」[RnlTRnJ血* 肛昆前 ELDR 和 STR加载/存储字和无符号字节指令。

      使用单一数据传送指令(STR和LDR)来装载和存储单一 字节或字的数据从/到内存LDR指令用于从内存中读取数据放入寄存器中;STR指令用于将寄存器中的数 据保存到内存指令格式如下:LDR{cond}{T} Rd,<地址 >;加载指定地址上的数据(字),放入Rd中STR{cond}{T} Rd,<地址>;存储数据(字)到指定地址的存储单元,要存储的数据在Rd中LDR{cond}B{T} Rd,<地址>;加载字节数据,放入Rd中,即Rd最低字节有效,高24位清 零STR{cond}B{T} Rd,〈地址〉;存储字节数据,要存储的数据在Rd,最低字节有效其中,T为可选后缀,若指令有T,那么即使处理器是在特权模式下,存储系统也将访问 看成是处理器是在用户模式下T在用户模式下无效,不能与前索引偏移一起使用TLDR/STR 指令寻址是非常灵活的,由两部分组成,一部分为一个基址寄存器,可以为任一 个通用寄存器,另一部分为一个地址偏移量地址偏移量有以下3 种格式:(1) 立即数立即数可以是一个无符号数值,这个数据可以加到基址寄存器,也可以从基 址寄存器中减去这个数值指令举例如下:LDR Rl,[R0,#0xl2];将R0+0xl2地址处的数据读出,保存到R1中(R0的值不变)LDR Rl,[R0,#-0xl2];将R0-0xl2地址处的数据读出,保存到R1中(R0的值不变)LDR R1,[RO];将只0地址处的数据读出,保存到R1中(零偏移)(2) 寄存器。

      寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值 指令举例值指令举例如下:LDR Rl,[R0,R2];将R0+R2地址的数据计读出,保存到R1中(R0的值不变)LDR Rl,[R0,-R2];将R0-R2地址处的数据计读出,保存到R1中(R0的值不变)(3) 寄存器及移位常数寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中 减去这个数值指令举例如下:LDR Rl,[R0,R2,LSL #2];将R0+R2*4地址处的数据读出,保存到R1中(RO,R2的值不 变)LDR R1,[R0,-R2,LSL #2];将R0-R2*4地址处的数据计读出,保存到R1中(R0,R2的值不 变)从寻址方式的地址计算方法分,加载/存储指令有以下4 种形式:(1) 零偏移Rn的值作为传送数据的地址,即地址偏移量为0指令举例如下:LDR Rd,[Rn](2) 前索引偏移在数据传送之前,将偏移量加到Rn中,其结果作为传送数据的存储地址若使用后缀“!”,则结果写回到Rn中,且Rn值不允许为R15指令举例如下:LDR Rd,[Rn,#0x04]!LDR Rd,[Rn,#-0x04](3) 程序相对偏移。

      程序相对偏移是索引形式的另一个版本汇编器由PC寄存器计算偏 移量,并将PC寄存器作为Rn生成前索引指令不能使用后缀“!”指令举例如下:LDR Rd,label ;label为程序标号,label必须是在当前指令的土4KB范围内(4) 后索引偏移Rn的值用做传送数据的存储地址在数据传送后,将偏移量与Rn相加, 结果写回到。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.