混合语言编程

混合语言编程

ID:41033036

大小:75.00 KB

页数:5页

时间:2019-08-14

混合语言编程_第1页
混合语言编程_第2页
混合语言编程_第3页
混合语言编程_第4页
混合语言编程_第5页
资源描述:

《混合语言编程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

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规定了一些子程序间调

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。