- DSP控制器原理与技术应用
- 宋合志编著
- 1134字
- 2025-02-17 21:50:41
2.1.4 C语言与汇编语言混合编程
C语言与汇编语言混合编程通常有如下3种方法:①在C程序中直接嵌入汇编语句;②独立的C模块和汇编模块接口;③C程序中访问汇编程序变量。
1.在C程序中直接嵌入汇编语句
在C程序中嵌入汇编语句是一种直接的C模块和汇编模块接口方法。这种方法一方面可以在C程序中实现用C语言难以实现的一些硬件控制功能;另一方面也可以在C程序中的关键部分用汇编语句代替C语句以优化程序。这种方法的一个缺点是它比较容易破坏C环境,因为C编译器在编译嵌入了汇编语句的C程序时并不检查或分析所嵌入的汇编语句。直接在C语言程序中相应位置嵌入汇编语句,只需在汇编语句加上双引号和小括号,前面加asm标识符号,称为ASM语句(ASM Statement),一般格式为
asm("汇编语句")
例如:


注意双引号内第一个字符必须是空格,这与汇编语言程序的要求是一样的。
2.独立的C模块和汇编模块接口
独立编写C程序与汇编程序,分别编译、汇编生成目标代码模块,然后用链接器连接起来。C程序可以调用汇编子程序,也可以访问汇编程序中定义的变量。同样汇编程序可以调用C函数或访问C程序中定义的变量。
在编写独立的汇编程序时,必须注意以下几点。
1)不论是用C语言编写的函数还是用汇编语言编写的函数,都必须遵循寄存器使用规则。
2)必须保护C函数要用到的几个特定寄存器(XAR1、XAR2、XAR3、SP)。
3)中断程序必须保护所有用到的寄存器。
4)从汇编程序调用C函数时,第一个参数(最左边)必须放入累加器中,剩下的参数按自右向左的顺序压入堆栈。
5)调用C函数时,注意C函数只保护了几个特定的寄存器,而其他的可以自由使用。
6)长整型和浮点数在存储器中存放的顺序是低位字在高地址,高位字在低地址。
7)如果函数有返回值,返回值存放在累加器中。
8)汇编语言模块不能改变由C模块产生的.cinit段,如果改变其内容将会引起不可预测的后果。
9)编译器在所有标识符(函数名、变量名等)前加下画线“_”,因此,在编写汇编程序时,必须在C程序可以访问的标识符前加“_”。
10)任何在汇编程序中定义的对象或函数,如果需要在C程序中访问或调用,则必须用汇编命令。
3.C程序访问汇编程序的变量
从C程序中访问在汇编程序中定义的变量或常数,可以分为访问在或不在.bss段中定义的变量两种情况。
对于访问在.bss段中定义的变量,可以采用如下方法实现:①采用.bss命令定义变量;②采用.global命令将命令声明为全局变量;③在汇编程序变量名加下画线“_”;④在C程序中将变量声明为外部变量,然后进行正常的访问。
【例2-1】 在C程序中访问在.bss段中定义的变量。
汇编程序:

对于访问不在.bss段中定义的变量,例如访问汇编程序的常数表,可以定义一个指向该变量的指针,然后在程序中间接访问该变量。
【例2-2】 在C程序中访问不在.bss段中定义的变量。
汇编程序:

C程序:
