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++程序中需要共享的变量或函数用PUBLIC或extern关键字分别声明为全局变量或全局函数,然后在其它程序文件中即可进行访问和调用。但是从好的编程风格来说,最好尽量减少全局变量和全局函数的使用。
混合编程中,必须遵守一定的调用规则,如物理寄存器的使用、参数的传递等。ARM专门为此制定了一个标准ATPCS(ARM-Thumb Procedure Call Standard,ARM-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");
} |