第4章 ARM指令分类及寻址方式_第1页
第4章 ARM指令分类及寻址方式_第2页
第4章 ARM指令分类及寻址方式_第3页
第4章 ARM指令分类及寻址方式_第4页
第4章 ARM指令分类及寻址方式_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

4CHAPTERARM指令分类及寻址方式1132ARM微处理器指令的分类ARM微处理器指令的寻址方式ARM微处理器指令的条件域内容组织C语言和汇编语言混合编程424.1ARM微处理器的指令系统

ARM微处理器的指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。ARM微处理器的指令集可以分为六大类:跳转指令数据处理指令程序状态寄存器(PSR)处理指令加载/存储指令协处理器指令和异常产生指令一、ARM微处理器指令的分类3ARM微处理器指令表-1助记符指令功能描述ADC带进位加法指令ADD加法指令AND逻辑与指令B跳转指令BIC位清零指令BL带返回的跳转指令BLX带返回和状态切换的跳转指令BX带状态切换的跳转指令4ARM微处理器指令表-2助记符指令功能描述CDP协处理器数据操作指令CMN比较反值指令CMP比较指令EOR异或指令LDC存储器到协处理器的数据传输指令LDM加载多个寄存器指令LDR存储器到寄存器的数据传输指令MCRARM寄存器到协处理器寄存器数据传输5助记符指令功能描述MLA乘加运算指令MOV数据传送指令MRC协处理器寄存器到ARM寄存器数据传输MRS传送CPSR或SPSR的内容到通用寄存器MSR传送通用寄存器到CPSR或SPSR的指令MUL32位乘法指令MLA32位乘加指令MVN数据取反传送指令ARM微处理器指令表-36助记符指令功能描述ORR逻辑或指令RSB逆向减法指令RSC带借位的逆向减法指令SBC带借位减法指令STC协处理器寄存器写入存储器指令STM批量内存字写入指令STR寄存器到存储器的数据传输指令SUB减法指令ARM微处理器指令表-47助记符指令功能描述SWI软件中断指令SWP交换指令TEQ相等测试指令TST位测试指令ARM微处理器指令表-58当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。每一条ARM指令包含4位的条件码,位于指令的最高4位[31:28]。条件码共有16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。例如,跳转指令B可以加上后缀EQ变为BEQ表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。二、ARM微处理器指令的条件域9指令的条件域表-1条件码后缀标

志含

义0000EQZ置位相等0001NEZ清零不相等0010CSC置位无符号数大于或等于0011CCC清零无符号数小于0100MIN置位负数0101PLN清零正数或零0110VSV置位溢出0111VCV清零未溢出10指令的条件域表-2条件码后缀标

志含

义1001LSC清零Z置位无符号数小于或等于1010GEN等于V带符号数大于或等于1011LTN不等于V带符号数小于1100GTZ清零且(N等于V)带符号数大于1101LEZ置位或(N不等于V)带符号数小于或等于1110AL忽略无条件执行114.2ARM指令的寻址方式ARM指令系统支持如下几种常见的寻址方式:立即寻址寄存器寻址寄存器间接寻址基址变址寻址多寄存器寻址相对寻址堆栈寻址

12立即寻址立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。例如以下指令:

ADD R0,R0,#1 /*R0←R0+1*/ADD R0,R0,#0x3f /*R0←R0+0x3f*/在以上两条指令中,第二个源操作数即为立即数,要求以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”。

13寄存器寻址寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。以下指令:

ADD R0,R1,R2 /*R0←R1+R2*/该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。

14寄存器间接寻址寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:

LDR R0,[R1] /*R0←[R1]*/STR R0,[R1] /*[R1]←R0*/第一条指令将以R1的值为地址的存储器中的数据传送到R0中。第二条指令将R0的值传送到以R1的值为地址的存储器中。

15基址变址寻址基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。采用变址寻址方式的指令常见有以下几种形式,如下所示:

LDRR0,[R1,#4] ;R0←[R1+4] LDRR0,[R1,#4]!

;R0←[R1+4]、R1←R1+4 LDRR0,[R1],#4 ;R0←[R1]、R1←R1+4 LDRR0,[R1,R2] ;R0←[R1+R2]在第一条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中。在第二条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。在第三条指令中,以寄存器R1的内容作为操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。在第四条指令中,将寄存器R1的内容加上寄存器R2的内容形成操作数的有效地址,从而取得操作数存入寄存器R0中。

16多寄存器寻址17采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值。以下指令:LDMIA R0!,{R3-R9} ;取出R0所指向的多个单元数据,保存到R3~R9中,R0值更新STMIAR1!,{R3-R9,R11} ;将R3~R9、R11的数据存储到R1所指向的单元中,R1值更新STMFDSP!,{R0-R7,LR} ;保护现场,将R0-R7、LR入栈LDMFDSP!,{R0-R7,PC}^ ;恢复现场,异常处理返回该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送到R1~R4。

后缀相应有IB、DA、DB、FD、FA、ED、EA。18ARM指令的寻址方式19相对寻址

与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式:

BL NEXT ;跳转到子程序NEXT处执行

……

NEXT …… MOV PC,LR ;从子程序返回

20堆栈寻址堆栈是一种数据结构,按先进后出(FirstInLastOut,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(FullStack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(EmptyStack)。

21堆栈寻址根据堆栈的生成方式,又可以分为递增堆栈(AscendingStack)和递减堆栈(DecendingStack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有四种类型的堆栈工作方式

满递增堆栈(FA):堆栈指针指向最后压入的数据,且由低地址向高地址生成。满递减堆栈(FD):堆栈指针指向最后压入的数据,且由高地址向低地址生成。空递增堆栈(EA):堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。空递减堆栈(ED):堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成

2223软件中断指令SWI:指令格式为:

SWI{条件}24位的立即数

SWI指令为软件中断指令,用于产生软件中断,从而实现在用户模式下切换到管理模式下,CPSR保存到管理模式的SPSR中,执行转移到SWI向量。在其他模式下也可使用SWI指令,处理器同样切换到管理模式。24第一种方法:指令中24位的立即数指定了用户请求的服务类型,参数通过通用寄存器传递。

MOV R0,#34 ;设置子功能号为34 SWI 12 ;调用12号软中断第二种方法:指令中的24位立即数被忽略,用户请求的服务类型由寄存器R0的值决定,参数通过其他的通用寄存器传递。

MOV R0,#12 ;调用12号软中断

MOV R1,#34 ;设置子功能号为34 SWI 025在SWI异常中断处理程序中,取出SWI立即数的步骤为:首先确定引起软中断的SWI指令是ARM指令还是Thumb指令,这可通过对SPSR访问得到;然后要取得该SWI指令的地址,这可通过访问LR寄存器得到;接着读出指令,分解出立即数。下面所示的程序段可用来读取SWI立即数。26

T_BIT EQU 0x20SWI_Handler ;SWI异常中断进入

STMFD SP!,{R0-R3,R12,LR} ;现场保护

MRS R0,SPSR ;读取SPSR STMFD SP!,{R0} ;保存SPSR TST R0,#T_BIT ;测试T标志位

LDRNEH R0,[R0,#-2];若是Thumb指令,读取指令码(16位)

BICNE R0,R0,#0xFF00 ;取得Thumb指令的8位立即数

LDREQ R0,[LR,#-4] ;若是ARM指令,读取指令码(32位)

BICEQ R0,R0,#0xFF000000 ;取得ARM指令的24位立即数

…… LDMFD SP!,{R0-R3,R12,PC}^ ;SWI异常中断返回27C语言和汇编语言混合编程混合编程包括:在C/C++代码中嵌入汇编指令;在汇编程序和C/C++程序之间实现变量的互访;汇编程序、C/C++程序间的相互调用。28在C/C++代码中嵌入汇编指令内嵌汇编语言的语法为:__asm{

汇编指令/*注释*/ …

汇编指令

}29voidDisable_IRQ(void){ __asm{MRS R4,CPSRORR R4,R4,#0x80MSR CPSR_c,R4}}禁止IRQ中断:不能直接向PC寄存器赋值,程序跳转只能使用B或BL指令实现;使用物理寄存器的指令中,不要使用过于复杂的C表达式。注意:30编译器可能会使用R12或R13存放编译的中间结果,在计算表达式的值时,可能会将寄存器R0~R3、R12和LR用于子程序调用。因此,在内嵌汇编语言程序时,不要将这些寄存器同时指定为汇编指令中的物理寄存器。

31汇编程序访问C变量在C程序中声明的全局变量可以被汇编程序访问。汇编程序访问方法为:使用IMPORT伪指令引入全局变量,并利用LDR或STR指令根据全局变量的地址访问它们。

unsignedchar :LDRB/STRB unsignedshort :LDRH/STRH unsignedint

:LDR/STR char :LDRSB/STRSB short :LDRSH/STRSH32

AREA globals,CODE,READONLY EXPORT asmsub IMPORT globv1

asmsub

LDR R1,=globv1 LDR R0,[R1] ADD R0,R0,#2 STR R0,[R1] MOV PC,LR END程序中变量globv1是在C程序中声明的全局变量,汇编程序实现将其读出,加2后在送回保存。33C与汇编程序相互调用在C程序和ARM汇编程序之间相互调用必须遵守ATPCS(ARM-THUMBprocedurecallstandard)。PCS强制实现如下约定:调用函数如何传递参数(即压栈方法,以何种方式存放参数),被调用函数如何获取参数,以何种方式传递函数返回值。汇编语言子程序必须满足下面3个条件:1)在子程序编写时必须遵守相应的ATPCS规则;2)堆栈的使用要遵守相应的ATPCS规则;3)在汇编编译器中使用-apcs选项。34寄存器的使用必须满足下面的规则:1)子程序间通过寄存器R0~R3来传递参数。这时,寄存器R0~R3可以记作A0~A3。被调用的子程序在返回前无需恢复寄存器R0~R3的内容。2)在子程序中,使用寄存器R4~R11来保存局部变量。这时,寄存器R4~R11可以记作V1~V8。如果在子程序中使用到了寄存器V1~V8中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值。3)寄存器R12用于子程序中间临时寄存器,记作IP。在子程序间的连接代码段中常有这种使用规则。354)寄存器R13用作数据栈指针,记作SP。在子程序中寄存器R13不能用作其他用途。寄存器R13在进入子程序时的值和退出子程序时的值必须相等。5)寄存器R14称为链接寄存器,记作LR。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。6)寄存器R15是程序计数器,记作PC。它不能用作其他用途。36参数传递规则:2)子程序中结果返回的规则如下:结果为一个32位的整数时,可以通过寄存器R0返回;结果为一个64位的整数时,可以通过寄存器R0和R1返回,依次类推。对于位数更多的结果,需要通过内存来传递。1)当参数不超过4个时,可以使用寄存器R0~R3来传递参数;当参数超过4个时,还可以使用数据栈来传递参数。37C程序调用汇编程序:汇编程序的设计要遵循ATPCS,保证程序调用时参数的正确传递。在汇编程序中使用EXPORT伪操作声明本程序段,使得本程序可以被别的程序调用。在C语言程序中使用extern关键词声明该汇编程序段。 被调用的汇编子程序:

AREAScopy,CODE,READONLY EXPORT strcopy

strcopy ;R0为目标串地址,R1为源串地址

LDRBR2,[R1],#1 STRBR2,[R0],#1 CMPR2,#0 BNEstrcopy MOV PC,LR END38调用汇编程序的C程序:#include<stdio.h>externvoidstrcopy(char*d,constchar*s);//声明外部函数,

//即要调用的汇编子程序intmain(void){constchar*srcstr="Firststring-s

温馨提示

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

评论

0/150

提交评论