嵌入式混合编程.ppt
文本预览下载声明
混合编程 1.ARM与THUMB交互 2.汇编与C语言的混合编程 ARM与THUMB的交互 1. 简单的交互程序设计例子 例5.10为一个从ARM代码段跳转的Thumb代码段,又回到ARM代码段的简单的交互程序设计的示例。 例5.10 简单的交互程序。 CODE 32 ;指示下面的指令为ARM指令 ADR R0,Into_thumb+1 ;产生目标地址,并且设置目标地址的状态为Thumb状态 BX R0 ; … CODE 16 ;指示下面的指令为Thumb指令 Into_thumb … ADR R5,Back_to_arm ;产生目标地址,并且设置目标地址的状态为ARM状态 BX R5 … CODE 32 ;指示下面的指令为ARM指令 Back_to_arm … ARM调用THUMB子程序 例5.12 ARM状态下Thumb子程序的调用。 AREA thumbadd,CODE,READONLY ;定义一个代码段 ENTRY ; start MOV R0,#2 ; 寄存器赋值 MOV R1,#3 ; ADR R4,thumbsub+1 ;生成分支地址并置最低位为1 MOV LR,PC ;存储返回地址 BX R4 ;分支并切换到thumbsub stop ;程序中止 MOV R0,#0x18 LDR R1,=0x20026 SWI 0x123456 CODE16 ;后面代码为Thumb代码 thumbsub ADD R0,R0,R1 ;R0=R0+R1 BX LR ;返回到ARM调用程序 END THUMB调用ARM子程序 例5.13 Thumb状态下ARM子程序的调用。 AREA armadd,CODE,READONLY ;定义一个代码段 ENTRY ;程序入口,汇编器处于ARM模式 start ;ARM指令头 ADR R2,thumbprog+1 BX R2 CODE16 ;下面指令为Thumb指令 thumbprog MOV R0,#2 ;寄存器赋值 MOV R1,#3 ADR R4,armsubroutine ;分支目的地址放入R4中,且bit0为0 BL _call_via_r4 ;间接调用代码段,保存返回地址到LR寄存器,且目的地址的最低位为1 stop ;执行中止 MOV R0,#0x18 LDR R1,=0x20026 SWI 0Xab _call_via_r4 ;Thumb代码段 BX R4 ;分支并切换 CODE32 ;下面指令为ARM指令 THUMB调用ARM子程序 armsubroutine ADD R0,R0,R1 ;R0=R0+R1 BX LR ;返回到Thumb调用程序处;LR的bit0已经被Thumb状态下的BL 指令;置为1了 END 与C的混合编程 ARM体系结构支持C/C++,以及与汇编语言的混合编程。汇编语言与C/C++混合编程通常有以下几种方式: 1、在C/C++代码中嵌入汇编指令; 2、在汇编程序和C/C++的程序之间进行变量的互访; 3、汇编程序、C/C++程序间的相互调用。 混合编程中,必须遵守一定的调用规则,如物理寄存器的使用、参数的传递等,ARM专门为此制定了一个标准,这就是下面要介绍ARM过程调用标准ATPCS。 ATPCS ATPCS,即ARM、Thumb过程调用标准(ARM-Thumb Procedure Call Standard),这个标准定义了相互独立的汇编模块或汇编模块间调用时必须遵守的一些约定,诸如在内存使用上的约定,包括寄存器、数据栈等的使用,描述了子程序是如何被单独编写、编译、汇编并组合在一起工作。通过使用ATPCS可以方便地将各种不同语言编写的程序组合成一个完整的文件。 通过使用GCC的C语言编译器的“apcs/interwork”编译选项,可以使编译的C语言程序满足ATPCS规则。而对于汇编语言程序来说,除了需要对汇编器使用“-apcs”选项外,在程序编写时还要注意必须遵守相应的ATPCS规则。基本ATPCS规定了在子程序调用时的一些基本规则,包括:各寄存器的使用规则及其相应的名称、堆栈的使用规则和参数传送的规则 ATPCS寄存器堆栈规则 表5.1 ATPCS 寄存器 ATPCS名称ATPCS寄存器的使用规则及功能如下。
显示全部