首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM 汇编语言与C/C++的混合编程

ARM 汇编语言与C/C++的混合编程

3.8.5  汇编语言与C/C++的混合编程在应用系统的程序设计中,若所有的编程任务均用汇编语言来完成,其工作量是可想而知的,同时,不利于系统升级或应用软件移植,事实上,ARM体系结构支持C/C+以及与汇编语言的混合编程,在一个完整的程序设计的中,除了初始化部分用汇编语言完成以外,其主要的编程任务一般都用C/C++完成。
汇编语言与C/C++的混合编程通常有以下几种方式:
1. 在C/C++代码中嵌入汇编指令。
ARM C中,可以使用关键字__arm来标识一段汇编指令程序。格式如下:
__asm
{
  汇编指令序列
}
即可在C语言源程序中直接执行ARM汇编指令。
2. 在汇编程序和C/C++的程序之间进行变量的互访。
3. 汇编程序、C/C++程序间的相互调用。
可以把汇编程序和C/C++程序中需要共享的变量或函数用PUBLICextern关键字分别声明为全局变量或全局函数,然后在其它程序文件中即可进行访问和调用。但是从好的编程风格来说,最好尽量减少全局变量和全局函数的使用。
混合编程中,必须遵守一定的调用规则,如物理寄存器的使用、参数的传递等。ARM专门为此制定了一个标准ATPCS(ARM-Thumb Procedure Call StandardARM-Thumb过程调用标准)。对于初学者来说,这是非常烦琐的,在实际工作中也没有太多必要。
在实际的编程应用中,使用较多的方式是:系统程序的初始化部分用汇编语言完成,然后用C/C++完成主要的编程任务,程序在执行时首先完成初始化过程,然后跳转到C/C++程序代码中。汇编程序和C/C++程序之间一般没有参数的传递,也没有频繁的相互调用,因此,整个程序的结构显得相对简单,容易理解。
以下是一个这种结构程序的基本示例。该程序非常简单,建立一个工程asm_c.eww,工程中包括一个汇编语言程序文件init.s79和一个C语言程序文件hello.c
代码清单3.6——init.s79文件
        NAME INIT
        PUBLIC  main                                          
        EXTERN  Main                           ;声明引入C程序的Main()函数
   B main
        RSEG CODE                                    
        CODE32                                         
main:
        NOP               ;此处可以插入用户自己编写的系统初始化代码

        B Main                                 ;转向C语言程序
        ENDMOD                                                  
        END      
代码清单3.7——hello.c文件:
#include <stdio.h>
/*注意此处C语言程序的入口函数是大小写敏感的Main()函数,而不是常用的main()函数。这是为了跟汇编程序中的main入口区别开,以免造成工程有两个程序入口。*/
int Main(void)
{
   printf("Hello, world!\n");
}
返回列表