欢迎来到天天文库
浏览记录
ID:41033036
大小:75.00 KB
页数:5页
时间:2019-08-14
《混合语言编程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、2.6混合语言编程目前,在嵌入式系统开发中,使用的主要编程语言是C语言和汇编语言。在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较好,便于人的理解,而且有大量的支持库。尽管如此,很多地方还是要用到汇编语言,例如开机时硬件系统的初始化,包括CPU状态的设定、中断的使能、主频的设定、RAM的初始化等,一些中断处理也可能涉及汇编。另外,对性能非常敏感的代码,需要手工编写汇编语言程序。汇编语言是和CPU的指令集紧密相关的。作为涉及底层的嵌入式系统开发,必须熟
2、练对汇编语言的使用。使用C语言和汇编语言进行混合编程,可以充分发挥各自的优势,取得显著效果。在C中嵌入汇编的格式为:asm("汇编语句":输出寄存器:输入寄存器:会被修改的寄存器);其中:汇编语句:是写汇编指令的地方;输出寄存器:表示当这段嵌入汇编执行后,用于存放输出数据的寄存器。这些寄存器会分别对应一个C语言表达式或一个内存地址;输入寄存器:表示在开始执行汇编指令时,指定一些寄存器中应存放输入值,它们也分别对应着一个C变量或常数值。会被修改的寄存器:在gcc知道会被修改的寄存器后,能够对代码进
3、行优化。示例:01 #defineget_seg_byte(seg,addr) 2 ({ 3 registerchar__res;04 __asm__("push%%fs; 5 mov%%ax,%%fs; 6 movb%%fs:%2,%%al; 7 pop%%fs" 8 :"=a"(__res) 9 :""(seg),"m"(*(addr)));10
4、__res;})这段10行的代码定义了一个嵌入汇编语言宏函数。用圆括号括住的组合语句(花括号中的语句)可以作为表达式使用,第10行变量__res是该表达式的输出值。宏语句要在一行上定义,因此使用“”将这些语句连成一行。宏的名字是get_seg_byte(seg,addr)。第3行定义寄存器变量__res。第4行的__asm__表示嵌入汇编语句的开始。4-7行是AT&T格式的汇编语句。第8行是输出寄存器,其含义是此段代码结束后将eax所代表的寄存器的值放入__res变量中,作为本函数的输出值,"
5、=a"中的"a"称为加载代码,"="表示这是输出寄存器。第9行表示此段代码开始运行时将seg放到eax寄存器中,""表示使用与上面同个位置的输出相同的寄存器。"m"表示使用一个内存偏移地址值。为了在上面的汇编语句中使用该地址值,嵌入汇编程序规定把输出和输入寄存器统一按顺序编号,从输出寄存器序列开始,从左到右,从上到下,以"%0"开始,分别记为%0、%1、…、%9。因此,输出寄存器的编号是%0(这里只有一个输出寄存器),输入寄存器前一部分(""(seg))的编号是%1,而后部的编号是%2。上面第6
6、行上的%2即代表(*(addr))这个内存偏移量。第4行代码的作用是将fs段寄存器的内容入栈;第5行将eax中的段值赋给fs段寄存器;第6行是把fs:(*(addr))所指定的字节放入al寄存器中。当执行完汇编语句后,输出寄存器eax的值将被放入__res,作为该宏函数的返回值。这段程序中,seg代表一个指定的内存段值,而addr表示一个内存偏移地址量。该宏函数的功能是从指定段和偏移值的内存地址处取一个字节。一些可能会用到的寄存器加载代码及其具体的含义见表2.19。表2.19寄存器加载代码及其具
7、体的含义代码含义代码含义a使用寄存器eaxm使用内存地址b使用寄存器ebxo使用内存地址并可以加偏移量c使用寄存器ecxI使用常数0~31d使用寄存器edxJ使用常数0~63S使用esiK使用常数0~255D使用ediL使用常数0~65535q使用动态字节可寻址寄存器(eax、ebx、ecx或edx) M使用常数0~3r使用任意动态分配的寄存器N使用1字节常数(0~255) g使用通用有效的地址即可(eax、ebx、ecx、edx或内存变量) O使用常数0~31A使用eax与edx联合(64位)
8、 下面主要介绍基于ARM的C语言与汇编语言的混合编程。1.C语言与汇编语言混合编程应遵守的规则ARM编程中使用的C语言是标准C语言。在使用C语言时,要用到和汇编语言的混合编程。若汇编代码较为简洁,则可使用直接内嵌汇编的方法;否则要将汇编程序以文件的形式加入到项目中,按照ATPCS(ARM/ThumbProcedureCallStandard,ARM/Thumb过程调用标准)的规定与C程序相互调用与访问。在C和ARM汇编语言程序之间相互调用时,必须遵守ATPCS规则。ATPCS规定了一些子程序间调
此文档下载收益归作者所有