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

下载本文档

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

文档简介

1、1ARM 微处理器指令的分类ARM 微处理器指令的寻址方式ARM 微处理器指令的条件域内内容容组组织织C语言和汇编语言混合编程2ARM微处理器的指令系统 q ARM微处理器的指令集是加载微处理器的指令集是加载/存储型的,也即指令集仅存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载而对系统存储器的访问则需要通过专门的加载/存储指令存储指令来完成。来完成。q ARM微处理器的指令集可以分为六大类微处理器的指令集可以分为六大类 : 跳转指令跳转指令 数据处理指令数据处理指令 程序状态

2、寄存器(程序状态寄存器(PSR)处理指令)处理指令 加载加载/存储指令存储指令 协处理器指令和异常产生指令协处理器指令和异常产生指令4.1 ARM 微处理器指令的分类微处理器指令的分类3ARM微处理器指令表微处理器指令表-1助记符助记符指令功能描述指令功能描述ADCADC带进位加法指令带进位加法指令ADDADD加法指令加法指令ANDAND逻辑与指令逻辑与指令B B跳转指令跳转指令BICBIC位清零指令位清零指令BLBL带返回的跳转指令带返回的跳转指令BLXBLX带返回和状态切换的跳转指令带返回和状态切换的跳转指令BXBX带状态切换的跳转指令带状态切换的跳转指令4.1 ARM 微处理器指令的分类

3、微处理器指令的分类4ARM微处理器指令表微处理器指令表-2助记符助记符指令功能描述指令功能描述CDPCDP协处理器数据操作指令协处理器数据操作指令CMNCMN比较反值指令比较反值指令CMPCMP比较指令比较指令EOREOR异或指令异或指令LDCLDC存储器到协处理器的数据传输指令存储器到协处理器的数据传输指令LDMLDM加载多个寄存器指令加载多个寄存器指令LDRLDR存储器到寄存器的数据传输指令存储器到寄存器的数据传输指令MCRMCRARMARM寄存器到协处理器寄存器数据传输寄存器到协处理器寄存器数据传输4.1 ARM 微处理器指令的分类微处理器指令的分类5ARM微处理器指令表微处理器指令表-

4、3助记符助记符指令功能描述指令功能描述MLAMLA乘加运算指令乘加运算指令MOVMOV数据传送指令数据传送指令MRCMRC协处理器寄存器到协处理器寄存器到ARMARM寄存器数据传输寄存器数据传输MRSMRS传送传送CPSRCPSR或或SPSRSPSR的内容到通用寄存器的内容到通用寄存器MSRMSR传送通用寄存器到传送通用寄存器到CPSRCPSR或或SPSRSPSR的指令的指令MULMUL3232位乘法指令位乘法指令MLAMLA3232位乘加指令位乘加指令MVNMVN数据取反传送指令数据取反传送指令4.1 ARM 微处理器指令的分类微处理器指令的分类6ARM微处理器指令表微处理器指令表-4助记符

5、助记符指令功能描述指令功能描述ORRORR逻辑或指令逻辑或指令RSBRSB逆向减法指令逆向减法指令RSCRSC带借位的逆向减法指令带借位的逆向减法指令SBCSBC带借位减法指令带借位减法指令STCSTC协处理器寄存器写入存储器指令协处理器寄存器写入存储器指令STMSTM批量内存字写入指令批量内存字写入指令STRSTR寄存器到存储器的数据传输指令寄存器到存储器的数据传输指令SUBSUB减法指令减法指令4.1 ARM 微处理器指令的分类微处理器指令的分类7ARM微处理器指令表微处理器指令表-5助记符助记符指令功能描述指令功能描述SWISWI软件中断指令软件中断指令SWPSWP交换指令交换指令TEQ

6、TEQ相等测试指令相等测试指令TSTTST位测试指令位测试指令4.1 ARM 微处理器指令的分类微处理器指令的分类8指令的条件域 q 当处理器工作在当处理器工作在ARMARM状态时,几乎所有的指令均根据状态时,几乎所有的指令均根据CPSRCPSR中条件码的状态和指令的条件域有条件的执行。当指令的中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。执行条件满足时,指令被执行,否则指令被忽略。q 每一条每一条ARMARM指令包含指令包含4 4位的条件码,位于指令的最高位的条件码,位于指令的最高4 4位位31:2831:28。条件码共有。条件码共有1616种

7、,每种条件码可用两个字符表种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时示,这两个字符可以添加在指令助记符的后面和指令同时使用。例如,跳转指令使用。例如,跳转指令B B可以加上后缀可以加上后缀EQEQ变为变为BEQBEQ表示表示“相相等则跳转等则跳转”,即当,即当CPSRCPSR中的中的Z Z标志置位时发生跳转。标志置位时发生跳转。 4.2 ARM 微处理器指令的条件域微处理器指令的条件域9指令的条件域表-1条件码后缀标 志含 义0000EQZ置位相等0001NEZ清零不相等0010CSC置位无符号数大于或等于0011CCC清零无符号数小于0100MIN置位负数

8、0101PLN清零正数或零0110VSV置位溢出0111VCV清零未溢出4.2 ARM 微处理器指令的条件域微处理器指令的条件域10指令的条件域表-2条件码后缀标 志含 义1001LSC清零Z置位无符号数小于或等于1010GEN等于V带符号数大于或等于1011LTN不等于V带符号数小于1100GTZ清零且(N等于V)带符号数大于1101LEZ置位或(N不等于V)带符号数小于或等于1110AL忽略无条件执行4.2 ARM 微处理器指令的条件域微处理器指令的条件域11ARM指令的寻址方式ARMARM指令系统支持如下几种常见的寻址方式:指令系统支持如下几种常见的寻址方式:q 立即寻址立即寻址 q 寄

9、存器寻址寄存器寻址 q 寄存器间接寻址寄存器间接寻址 q 基址变址寻址基址变址寻址 q 多寄存器寻址多寄存器寻址 q 相对寻址相对寻址 q 堆栈寻址堆栈寻址 4.3 ARM 指令的寻址方式指令的寻址方式12立即寻址 q立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。例如以下指令:址。例如以下指令: ADDADDR0R0,R0R0,

10、1 1/ /* *R0R0R0R01 1* */ / ADD ADDR0R0,R0R0,0 x3f0 x3f/ /* *R0R0R0R00 x3f0 x3f* */ /q在以上两条指令中,第二个源操作数即为立即数,要求以在以上两条指令中,第二个源操作数即为立即数,要求以“”为前缀,对于以十六进制表示的立即数,还要求在为前缀,对于以十六进制表示的立即数,还要求在“”后加上后加上“0 x”0 x”。 4.3 ARM 指令的寻址方式指令的寻址方式13寄存器寻址 q寄存器寻址就是利用寄存器中的数值作为操作数,这种寻寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式

11、,也是一种执行址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。以下指令:效率较高的寻址方式。以下指令: ADDADDR0R0,R1R1,R2R2/ /* *R0R1R0R1R2R2* */ /q该指令的执行效果是将寄存器该指令的执行效果是将寄存器R1R1和和R2R2的内容相加,其结果的内容相加,其结果存放在寄存器存放在寄存器R0R0中。中。 4.3 ARM 指令的寻址方式指令的寻址方式14寄存器间接寻址 q寄存器间接寻址就是以寄存器中的值作为操作数的地址,寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:而操作数本身存放在存储器

12、中。例如以下指令: LDRLDRR0R0,R1R1/ /* *R0R1R0R1* */ / STR STRR0R0,R1R1/ /* *R1R0R1R0* */ /第一条指令将以第一条指令将以R1R1的值为地址的存储器中的数据传送到的值为地址的存储器中的数据传送到R0R0中。中。第二条指令将第二条指令将R0R0的值传送到以的值传送到以R1R1的值为地址的存储器中。的值为地址的存储器中。 4.3 ARM 指令的寻址方式指令的寻址方式15基址变址寻址 q 基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某

13、基地址附近的地址单元。采用变址寻址方式的指令常见有以下几种形式,如下所示:LDR R0,R1,4;R0R14LDR R0,R1,4!;R0R14、R1R14LDR R0,R1 ,4;R0R1、R1R14LDR R0,R1,R2;R0R1R2q 在第一条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中。q 在第二条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。q 在第三条指令中,以寄存器R1的内容作为操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。q 在第四条

14、指令中,将寄存器R1的内容加上寄存器R2的内容形成操作数的有效地址,从而取得操作数存入寄存器R0中。 4.3 ARM 指令的寻址方式指令的寻址方式16多寄存器寻址 4.3 ARM 指令的寻址方式指令的寻址方式17q 采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令完成传送最多种寻址方式可以用一条指令完成传送最多1616个通用寄存器的值。以下个通用寄存器的值。以下指令:指令:q LDMIAR0!,R3-R9 ;取出取出R0所指向的多个单元数据,保存所指向的多个单元数据,保存到到R3R9中,中,R0值更

15、新值更新q STMIA R1!, R3-R9,R11 ;将将R3R9、R11的数据存储到的数据存储到R1所指向的单元中,所指向的单元中,R1值更新值更新q STMFD SP!,R0-R7,LR ;保护现场,将保护现场,将R0-R7、LR入栈入栈q LDMFD SP!,R0-R7,PC;恢复现场,异常处理返回恢复现场,异常处理返回q 该指令的后缀该指令的后缀IA表示在每次执行完加载表示在每次执行完加载/存储操作后,存储操作后,R0按字长度增按字长度增加,因此,指令可将连续存储单元的值传送到加,因此,指令可将连续存储单元的值传送到R1R4。 后缀相应有后缀相应有IB、DA、DB、FD、FA、ED、

16、EA。4.3 ARM 指令的寻址方式指令的寻址方式184.3 ARM 指令的寻址方式指令的寻址方式19相对寻址 q 与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式:BL NEXT;跳转到子程序NEXT处执行NEXTMOV PC,LR;从子程序返回 4.3 ARM 指令的寻址方式指令的寻址方式20堆栈寻址 q 堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置

17、,堆栈指针总是指向栈顶。q 当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)。 ARM 指令的寻址方式指令的寻址方式21堆栈寻址q 根据堆栈的生成方式,又可以分为递增堆栈(Ascending Stack)和递减堆栈(Decending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有四种类型的堆栈工作方式 满递增堆栈(FA):堆栈指针指向最后压入的数据,且由低地址向高地址生成。满递减堆栈(FD):堆栈指针指向最后压入的数据,且由

18、高地址向低地址生成。空递增堆栈(EA):堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。空递减堆栈(ED):堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成 ARM 指令的寻址方式指令的寻址方式2223软件中断指令SWI: 指令格式为:指令格式为:SWI条件条件 24位的立即数位的立即数 SWI指令为软件中断指令,用于产生软件中断,从而实现在用指令为软件中断指令,用于产生软件中断,从而实现在用户模式下切换到管理模式下,户模式下切换到管理模式下,CPSR保存到管理模式的保存到管理模式的SPSR中,执行转移到中,执行转移到SWI向量。在其他模式下也可使用向量。在其他模

19、式下也可使用SWI指令,指令,处理器同样切换到管理模式。处理器同样切换到管理模式。 24第一种方法:第一种方法:指令中指令中24位的立即数指定了用户请求的服务类位的立即数指定了用户请求的服务类型,参数通过通用寄存器传递。型,参数通过通用寄存器传递。MOV R0,34 ;设置子功能号为设置子功能号为34SWI12; 调用调用12号软中断号软中断第二种方法:第二种方法:指令中的指令中的24位立即数被忽略,用户请求的服务位立即数被忽略,用户请求的服务类型由寄存器类型由寄存器R0的值决定,参数通过其他的通用寄存器传递。的值决定,参数通过其他的通用寄存器传递。MOV R0,12;调用调用12号软中断号软

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

21、Interrupt STMFD SP!, R0-R3, R12, LR MOV R1, SP ; R1指向参数存储位置指向参数存储位置 MRS R3, SPSR TST R3, #T_bit ; 中断前是否是中断前是否是Thumb状态状态 LDRNEH R0, LR,#-2 ; 是是: 取得取得Thumb状态状态SWI号号 BICNE R0, R0, #0 xff00 LDREQ R0, LR,#-4 ; 否否: 取得取得arm状态状态SWI号号 BICEQ R0, R0, #0 xFF000000 . BL SWI_Exception LDMFD SP!, R0-R3, R12, PC27A

22、RM中的伪指令q 伪指令指句不由伪指令指句不由CPU执行,只为汇编程序在汇编源程序时执行,只为汇编程序在汇编源程序时提供有关信息,如程序如何分段,有哪些逻辑段,定义了提供有关信息,如程序如何分段,有哪些逻辑段,定义了哪些数据单元和数据,内存单元如何分配等哪些数据单元和数据,内存单元如何分配等 。q 在在 ARM 汇编语言程序里,有一些特殊指令助记符,这汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作通常称这些特殊指令助记符为伪指令,他们所完成的操作称

23、为伪操作。伪指令在源程序中的作用是为完成汇编程序称为伪操作。伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起作用,作各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成。一旦汇编结束,伪指令的使命就完成。q 在在 ARM 的汇编程序中,有如下几种伪指令:的汇编程序中,有如下几种伪指令:符号定义伪符号定义伪指令指令、数据定义伪指令数据定义伪指令、汇编控制伪指令汇编控制伪指令、宏指令以及其宏指令以及其他伪指令他伪指令。 28 符号定义(符号定义( Symbol Definition )伪指令)伪指令 q 常见的符号定义伪指令有如下几种:

24、 用于定义全局变量的 GBLA 、 GBLL 和 GBLS 。 用于定义局部变量的 LCLA 、 LCLL 和 LCLS 。 用于对变量赋值的 SETA 、 SETL 、 SETS 。 为通用寄存器列表定义名称的 RLIST 。q GBLA Test1 ;定义一个全局的数字变量,变量名为 Test1 Test1 SETA 0 xaa ;将该变量赋值为 0 xaa GBLL Test2 ;定义一个全局的逻辑变量,变量名为 Test2 Test2 SETL TRUE ;将该变量赋值为真 GBLS Test3 ;定义一个全局的字符串变量,变量名为 Test3 Test3 SETS “ Testing

25、 ” ;将该变量赋值为 “ Testing ” 29q LCLA Test4 ;声明一个局部的数字变量,变量名为 Test4 Test3 SETA 0 xaa ;将该变量赋值为 0 xaa LCLL Test5 ;声明一个局部的逻辑变量,变量名为 Test5 Test4 SETL TRUE ;将该变量赋值为真 LCLS Test6 ;定义一个局部的字符串变量,变量名为 Test6 Test6 SETS “ Testing ” ;将该变量赋值为 “ Testing ” q RegList RLIST R0-R5 , R8 , R10 ;将寄存器列表名称定义为 RegList ,可在 ARM 指令

26、 LDM/STM中通过该名称访问寄存器列表。 30 数据定义(数据定义( Data Definition )伪指令)伪指令 q 常见的数据定义伪指令有如下几种: DCB 用于分配一片连续的字节存储单元并用指定的数据初始化。 DCW ( DCWU ) 用于分配一片连续的半字存储单元并用指定的数据初始化。 DCD ( DCDU ) 用于分配一片连续的字存储单元并用指定的数据初始化。 DCFD ( DCFDU )用于为双精度的浮点数分配一片连续的字存储单元并用指定的数据初始 化。 DCFS ( DCFSU ) 用于为单精度的浮点数分配一片连续的字存储单元并用指定的数据初 始化。 DCQ ( DCQU

27、 ) 用于分配一片以 8 字节为单位的连续的存储单元并用指定的数据初始 化。 SPACE 用于分配一片连续的存储单元 MAP 用于定义一个结构化的内存表首地址 FIELD 用于定义一个结构化的内存表的数据域 31汇编控制(汇编控制( Assembly Control )伪指令)伪指令 q 汇编控制伪指令用于控制汇编程序的执行流程,常用的汇编控制伪指令包括以下几条: IF 、 ELSE 、 ENDIF WHILE 、 WEND MACRO 、 MEND MEXIT q GBLL Test ;声明一个全局的逻辑变量,变量名为Test IF Test = TRUE 指令序列 1 ELSE 指令序列

28、2 ENDIF 32q MACRO、MEND MACRO $ 标号 宏名 $ 参数 1 , $ 参数 2 , 指令序列 MEND q 宏指令的使用方式和功能与子程序有些相似,子程序可以提供模块化的程序设计、节省存储空间并提高运行速度。但在使用子程序结构时需要保护现场,从而增加了系统的开销,因此,在代码较短且需要传递的参数较多时,可以使用宏指令代替子程序。q MACRO 、 MEND 伪指令可以将一段代码定义为一个整体,称为宏指令,然后就可以在程序中通过宏指令多次调用该段代码。其中, $ 标号在宏指令被展开时,标号会被替换为用户定义的符号, 宏指令可以使用一个或多个参数,当宏指令被展开时,这些参

29、数被相应的值替换。 33 MACRO$IRQ_Label HANDLER $IRQ_Exception EXPORT $IRQ_Label ; 输出的标号输出的标号 IMPORT $IRQ_Exception ; 引用的外部标号引用的外部标号$IRQ_Label SUB LR, LR, #4 ; 计算返回地址计算返回地址 STMFD SP!, R0-R3, R12, LR ; 保存任务环境保存任务环境 MRS R3, SPSR ; 保存状态保存状态 STMFD SP!, R3 LDR R2, =OSIntNesting ; OSIntNesting+ LDRB R1, R2 ADD R1, R

30、1, #1 STRB R1, R2 BL $IRQ_Exception ; 调用调用c语言的中断处理程序语言的中断处理程序 BL OSIntExit LDR R0, =OSTCBHighRdy LDR R0, R0 LDR R1, =OSTCBCur LDR R1, R1 CMP R0, R1 LDMFD SP!, R3 MSR SPSR_cxsf, R3 LDMEQFD SP!, R0-R3, R12, PC ; 不进行任务切换不进行任务切换 LDR PC, =OSIntCtxSw ; 进行任务切换进行任务切换 MEND IRQ_HandlerHANDLER IRQ_Exception Ti

31、mer0_Handler HANDLER Timer034其它的伪指令q AREA ALIGN CODE16 、 CODE32 ENTRY END EQU EXPORT (或 GLOBAL ) IMPORT EXTERN GET (或 INCLUDE ) INCBIN RN ROUT q AREA使用示例: AREA Init , CODE , READONLY 该伪指令定义了一个代码段,段名为 Init ,属性为只读 CODE 属性:用于定义代码段,默认为 READONLY 。 DATA 属性:用于定义数据段,默认为 READWRITE 。 READONLY 属性:指定本段为只读,代码段默认

32、为 READONLY 。 READWRITE 属性:指定本段为可读可写,数据段的默认属性为 READWRITE 。 35q CODE16、CODE32 语法格式: CODE16 (或 CODE32 ) CODE16 伪指令通知编译器,其后的指令序列为 16 位的 Thumb 指令。 CODE32 伪指令通知编译器,其后的指令序列为 32 位的 ARM 指令。 q ENTRY 语法格式: ENTRY ENTRY 伪指令用于指定汇编程序的入口点。在一个完整的汇编程序中至少要有一个 ENTRY (也可以有多个,当有多个 ENTRY 时,程序的真正入口点由链接器指定),但在一个源文件里最多只能有一个

33、ENTRY (可以没有)。 使用示例: AREA Init , CODE , READONLY ENTRY ;指定应用程序的入口点 q END 语法格式: END END 伪指令用于通知编译器已经到了源程序的结尾。 使用示例: AREA Init , CODE , READONLY END ;指定应用程序的结尾 36q EXPORT(或GLOBAL) 语法格式: EXPORT 标号 WEAK EXPORT 伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。 EXPORT可用 GLOBAL 代替。标号在程序中区分大小写, WEAK 选项声明其他的同名标号优先于该标号被引用。 使用

34、示例: AREA Init , CODE , READONLY EXPORT Stest ;声明一个可全局引用的标号Stest END q IMPORT 语法格式: IMPORT 标号 WEAK IMPORT 伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。 标号在程序中区分大小写, WEAK 选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为 0 ,若该标号为 B 或 BL 指令引用,则将 B 或 BL指令置为 NOP 操作。 使用示例: AR

35、EA Init , CODE , READONLY IMPORT Main ;通知编译器当前文件要引用标号Main,但Main 在其他源文件中定义 END 374.4 C语言和汇编语言混合编程语言和汇编语言混合编程混合编程包括:混合编程包括:q 在在C/C+C/C+代码中嵌入汇编指令;代码中嵌入汇编指令; q 在汇编程序和在汇编程序和C/C+C/C+程序之间实现变量的互访;程序之间实现变量的互访;q 汇编程序、 C/C+C/C+程序间的相互调用。程序间的相互调用。38C语言和汇编语言混合编程语言和汇编语言混合编程q 在在C/C+C/C+代码中嵌入汇编指令代码中嵌入汇编指令内嵌汇编语言的语法为:

36、内嵌汇编语言的语法为:_asm_asm 汇编指令汇编指令 / /* *注释注释* */ /汇编指令汇编指令 39void Disable_IRQ(void)_asm MRS R4, CPSR ORR R4, R4, #0 x80 MSR CPSR_c, R4 禁止禁止IRQ中断:中断:q 不能直接向不能直接向PCPC寄存器赋值,程序跳转只能使用寄存器赋值,程序跳转只能使用B B或或BLBL指令实现;指令实现;q 使用物理寄存器的指令中,不要使用过于复杂的使用物理寄存器的指令中,不要使用过于复杂的C C表达式。表达式。 注意:注意:C语言和汇编语言混合编程语言和汇编语言混合编程40q 编译器可能

37、会使用编译器可能会使用R12或或R13存放编译的中间结果,在计算存放编译的中间结果,在计算表达式的值时,可能会将寄存器表达式的值时,可能会将寄存器R0R3、R12和和LR用于子程用于子程序调用。因此,在内嵌汇编语言程序时,不要将这些寄存器序调用。因此,在内嵌汇编语言程序时,不要将这些寄存器同时指定为汇编指令中的物理寄存器。同时指定为汇编指令中的物理寄存器。 C语言和汇编语言混合编程语言和汇编语言混合编程41q 汇编程序访问汇编程序访问C C变量变量 在在C程序中声明的全局变量可以被汇编程序访问。汇编程序程序中声明的全局变量可以被汇编程序访问。汇编程序访问方法为:使用访问方法为:使用IMPORT

38、伪指令引入全局变量,并利用伪指令引入全局变量,并利用LDR或或STR指令根据全局变量的指令根据全局变量的地址地址访问它们访问它们 。unsigned char :LDRB/STRBunsigned short :LDRH/STRHunsigned int :LDR/STRchar :LDRSB/STRSBshort :LDRSH/STRSHC语言和汇编语言混合编程语言和汇编语言混合编程42AREA globals,CODE,READONLYEXPORTasmsubIMPORTglobv1 asmsubLDRR1,globv1; 大范围地址读取伪指令大范围地址读取伪指令 LDRR0,R1ADDR

39、0,R0,2STRR0,R1MOVPC,LREND程序中变量程序中变量globv1是在是在C程序中声明的全局变程序中声明的全局变量,汇编程序实现将其读出,加量,汇编程序实现将其读出,加2后在送回保存。后在送回保存。 C语言和汇编语言混合编程语言和汇编语言混合编程43q C C与汇编程序相互调用与汇编程序相互调用 在在C程序和程序和ARM汇编程序之间相互调用必须遵守汇编程序之间相互调用必须遵守ATPCS(ARM-THUMB procedure call standard )。PCS强制实现如下约定:强制实现如下约定:调用函数如何传递参数(即压栈方法,以何种方式存放参数),调用函数如何传递参数(即

40、压栈方法,以何种方式存放参数),被调用函数如何获取参数,以何种方式传递函数返回值。被调用函数如何获取参数,以何种方式传递函数返回值。 汇编语言子程序必须满足下面汇编语言子程序必须满足下面3个条件:个条件:1)在子程序编写时必须遵守相应的)在子程序编写时必须遵守相应的ATPCS规则;规则;2)堆栈的使用要遵守相应的)堆栈的使用要遵守相应的ATPCS规则;规则;3)在汇编编译器中使用)在汇编编译器中使用-apcs选项。选项。C语言和汇编语言混合编程语言和汇编语言混合编程44寄存器的使用寄存器的使用必须满足下面的规则:必须满足下面的规则:1)子程序间通过寄存器)子程序间通过寄存器R0R3来传递参数。

41、这时,寄存器来传递参数。这时,寄存器R0R3可以记作可以记作A0A3。被调用的子程序在返回前无需恢复寄。被调用的子程序在返回前无需恢复寄存器存器R0R3的内容。的内容。2)在子程序中,使用寄存器)在子程序中,使用寄存器R4R11来保存局部变量。这时,寄来保存局部变量。这时,寄存器存器R4R11可以记作可以记作V1V8。如果在子程序中使用到了寄存器。如果在子程序中使用到了寄存器V1V8中的某些寄存器,子程序进入时必须保存这些寄存器的值,中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值。在返回前必须恢复这些寄存器的值。3)寄存器)寄存器R12用于子程序中间临时寄存

42、器,记作用于子程序中间临时寄存器,记作IP。在子程序。在子程序间的连接代码段中常有这种使用规则。间的连接代码段中常有这种使用规则。C语言和汇编语言混合编程语言和汇编语言混合编程454)寄存器)寄存器R13用作数据栈指针,记作用作数据栈指针,记作SP。在子程序中寄存器。在子程序中寄存器R13不能用作其他用途。寄存器不能用作其他用途。寄存器R13在进入子程序时的值和退出在进入子程序时的值和退出子程序时的值必须相等。子程序时的值必须相等。5)寄存器)寄存器R14称为链接寄存器,记作称为链接寄存器,记作LR。它用于保存子程序的。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器返回地址。

43、如果在子程序中保存了返回地址,寄存器R14则可以则可以用作其他用途。用作其他用途。6)寄存器)寄存器R15是程序计数器,记作是程序计数器,记作PC。它不能用作其他用途。它不能用作其他用途。C语言和汇编语言混合编程语言和汇编语言混合编程46参数传递规则:参数传递规则: 2)子程序中结果返回的规则如下:)子程序中结果返回的规则如下: 结果为一个结果为一个32位的整数时,可以通过寄存器位的整数时,可以通过寄存器R0返回;结果为返回;结果为一个一个64位的整数时,可以通过寄存器位的整数时,可以通过寄存器R0和和R1返回,依次类推。返回,依次类推。 对于位数更多的结果,需要通过内存来传递。对于位数更多的结果,需要通过内存来传递。1)当参数不超过)当参数不超过4个时,可以使用寄存器个时,可以使用寄存器R0R3来传递参数;来传递参数;当参数超过当参数超过4个时,还可以使用数据栈来传递参数。个时,还可以使用数据栈

温馨提示

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

评论

0/150

提交评论