嵌入式混合编程.

上传人:我** 文档编号:117874858 上传时间:2019-12-11 格式:PPT 页数:16 大小:61KB
返回 下载 相关 举报
嵌入式混合编程._第1页
第1页 / 共16页
嵌入式混合编程._第2页
第2页 / 共16页
嵌入式混合编程._第3页
第3页 / 共16页
嵌入式混合编程._第4页
第4页 / 共16页
嵌入式混合编程._第5页
第5页 / 共16页
点击查看更多>>
资源描述

《嵌入式混合编程.》由会员分享,可在线阅读,更多相关《嵌入式混合编程.(16页珍藏版)》请在金锄头文库上搜索。

1、混合编程 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;

2、指示下面的指令为ARM指令 Back_to_arm ARM调用THUMB子程序 例5.12ARM状态下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,#0 x18 LDR R1,=0 x20026 SWI 0 x123456 CODE16;后面代码为Thumb代码 thumbsub AD

3、D 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 ;间接调用代码段,保存返

4、回地址到LR寄存器,且目 的地址的最低位为1 stop;执行中止 MOV R0,#0 x18 LDR R1,=0 x20026 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+代

5、码中嵌入汇编指令; 2、在汇编程序和C/C+的程序之间进行变量的互 访; 3、汇编程序、C/C+程序间的相互调用。 混合编程中,必须遵守一定的调用规则,如物理 寄存器的使用、参数的传递等,ARM专门为此制 定了一个标准,这就是下面要介绍ARM过程调用 标准ATPCS。 ATPCS ATPCS,即ARM、Thumb过程调用标准( ARM-Thumb Procedure Call Standard), 这个标准定义了相互独立的汇编模块或汇 编模块间调用时必须遵守的一些约定,诸 如在内存使用上的约定,包括寄存器、数 据栈等的使用,描述了子程序是如何被单 独编写、编译、汇编并组合在一起工作。 通过使用

6、ATPCS可以方便地将各种不同语 言编写的程序组合成一个完整的文件。 通过使用GCC的C语言编译器的 “apcs/interwork”编译选项,可以使编译的C 语言程序满足ATPCS规则。而对于汇编语 言程序来说,除了需要对汇编器使用“- apcs”选项外,在程序编写时还要注意必须遵 守相应的ATPCS规则。基本ATPCS规定了 在子程序调用时的一些基本规则,包括: 各寄存器的使用规则及其相应的名称、堆 栈的使用规则和参数传送的规则 ATPCS寄存器堆栈规则 表5.1 ATPCS 寄存器 ATPCS名称ATPCS寄存器的使用规则及功能如下 。 (1)子程序间通过寄存器R0R3来传递参数。 这时

7、,寄存器R0R3可记做a1a4。被调用的子 程序在返回前无需恢复寄存器R0R3的内容。 (2)在子程序中,使用寄存器R4R11来保存 局部变量。 ATPCS规定的数据栈为满降序(FD),即栈指 针指向栈顶元素,且数据栈的增长方向为向低地 址增长,并且对数据栈的操作是8字节对齐。 参数传递规则 可变数量参数传递规则(variadic routines)。 前4个字依次放入寄存器R0R3中(最低地址的 数进入R0中);剩余的字数据以逆序的方式放入 数据栈中,即入栈的顺序与参数的顺序相反,最 后一个字数据先入栈。 对于函数的返回结果,若为整数型数,则返回规 则如下:若结果的位数不超过4个字时,通过

8、R0R3返回;若结果的位数超过4个字时,通过 内存来返回。 对于浮点类型数据的函数的返回,其结果通过相 应的浮点寄存器返回,在此不做介绍。 汇编程序访问C语言全局变量 对unsigned char类型变量,使用LDRB/STRB 访问; 对unsigned short类型变量,使用LDRH/STRH 访问(对体系结构3使用LDRB/STRB访问); 对unsigned int类型变量,使用LDR/STR访问 ; 对char类型变量,使用LDRSB/STRSB访问; 对short类型变量,使用LDRSH/STRSH访 问。 例5.16 汇编程序访问C语言全局变量。 .text .global a

9、smsubroutine .exten globvar 引入C语言中的全局变量globvar asmsubroutine: LDR R1, globvar 读取globvar的地址到R1中 LDR R0,R1 读取变量值 ADD R0,R0,#2 STR R0,R1 MOV PC,LR .end C程序调用汇编程序的例子 C程序调用汇编程序应首先通过extern声明 要调用的汇编程序模块,声明中形参个数 要与汇编模块中需要的变量个数一致,且 参数传递要满足ATPCS规则,然后再在C 程序正文中调用。 例5.17下列使一个C程序调用汇编程序的串拷贝例子。 C程序为: include stdio.

10、h exten void *strcopy(char*d,char*s); int main() char*srcstr First stringsource; char*dststr Second stringdestination; printf(sn sn,srcstr,dststr); strcopy(dststr,srcstr); printf(After copying:n); printf(sn sn,srcstr,dststr); return(0); ARM汇编语言模块: .text .global strcopy Strcopy: R0指向目的数据串,R1指向源数据串 LD

11、RB R2,R1,#1 取字节并修改地址 STRB R2, R0,#1 存储字节并修改地址 CMP R2,0 检查是否到串尾 BNE strcopy 否,则继续 MOV PC,LR 返回 .end 其中,extern void strcopy(char*d,char*s)为汇编模块声明,strcopy(dststr,srcstr)为 汇编模块调用。 汇编程序调用C程序的例子 汇编程序调用C语言模块,在调用之前首 先必须根据C语言模块中需要的参数个数, 以及ATPCS参数传递规则,完成参数的传 递,即前 4个参数通过R0R3传递,后面 的参数通过堆栈传递,然后再利用B/BL指 令进行调用。 例5

12、.18定义汇编语言将要调用C的函数功能为返回5个参数之和,其函数原型 为: int g(int a,int b,int c,int d,int e) return a b c d e 汇编语言要完成的功能使求取i 2i 3i 4i 5i的结果,程序如下: .global_start .text _start: .extern g 引入C函数g STR LR,SP,#4! 保存LR ADD R1,R0,R0 R1 2*i(第2个参数) ADD R2,R1,R0 R2 3*i(第3个参数) ADD R3,R1,R2 R3 5*i STR R3,SP,#4! 第5个参数入栈 ADD R3,R1,R1 R3 4*i(第4个参数) BL g 调用C函数g ADD SP,SP,#4 第5个参数出栈 LDR PC,SP,#4 返回 .end 程序执行结束,结果保存于寄存器R0中。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号