C语言与汇编语言混合编程通常有如下三种方法:
1)在C程序中直接嵌入汇编语句。
2)独立的C模块和汇编模块接口。
3)C程序中访问汇编程序变量。
1.在C程序中直接嵌入汇编语句
在C程序中嵌入汇编语句是一种直接的C模块和汇编模块接口方法。这种方法一方面可以在C程序中实现用C语言难以实现的一些硬件控制功能。另一方面,也可以用这种方法在C程序中的关键部分用汇编语句代替C语句以优化程序。
这种方法的缺点是比较容易破坏C环境,因为C编译器在编译嵌入了汇编语句的C程序时并不检查或分析所嵌入的汇编语句。
直接在C语言程序中相应位置嵌入汇编语句,只需在汇编语句加上双引号和小括号,前面加asm标识符号,称为ASM语句(ASM Statement)。一般格式为
asm("汇编语句")
例如,
asm("NOP");
#define EINT asm ("clrcINTM") //开放中断
EINT; //宏EINT代表汇编指令clrcINTM
asm("EALLOW"); //解除EALLOW保护
注意双引号内第一个字符必须是空格,这与汇编语言程序的要求是一样的。
2.独立的C模块和汇编模块接口
独立编写C程序与汇编程序,分别编译、汇编生成目标代码模块,然后用链接器连接起来。C程序可以调用汇编子程序,也可以访问汇编程序中定义的变量。同样汇编程序可以调用C函数或访问C程序中定义的变量。
在编写独立的汇编程序时,必须注意以下几点:
1)不论是用C语言编写的函数还是用汇编语言编写的函数,都必须遵循寄存器使用规则。
2)必须保护C函数要用到的几个特定寄存器(XAR1、XAR2、XAR3、SP)。
3)中断程序必须保护所有用到的寄存器。
4)从汇编程序调用C函数时,第一个参数(最左边)必须放入累加器中,剩下的参数按自右向左的顺序压入堆栈。
5)调用C函数时,注意C函数只保护了几个特定的寄存器,而其他可以自由使用。
6)长整型和浮点数在存储器中存放的顺序是低位字在高地址,高位字在低地址。
7)如果函数有返回值,返回值存放在累加器中。(www.daowen.com)
8)汇编语言模块不能改变由C模块产生的.cinit段,如果改变其内容将会引起不可预测的后果。
9)编译器在所有标识符(函数名、变量名等)前加下划线“_”。因此,在编写汇编程序时,必须在C程序可以访问的标识符前加“_”。
10)任何在汇编程序中定义的对象或函数,如果需要在C程序中访问或调用,则必须用汇编命令.global(表示全局符号)定义。
3.C程序访问汇编程序的变量
从C程序中访问在汇编程序中定义的变量或常数,可以分为访问在或不在.bss段中定义的变量两种情况。
对于访问在.bss段中定义的变量,可以采用如下方法实现:
(1)采用.bss命令定义变量。
(2)采用.global命令将命令声明为全局变量。
(3)在汇编程序变量名加下划线“_”。
(4)在C程序中将变量声明为外部变量,然后进行正常的访问。
例4-4 在C程序中访问在.bss段中定义的变量。
汇编程序:
.bss _var,1 ;定义变量
.global _var;声明为全局变量
C程序:
extern int var //声明为外部变量
var=1 //访问变量
对于访问不在.bss段中定义的变量,例如访问汇编程序的常数表,可以定义一个指向该变量的指针,然后在程序中间接访问该变量。
例4-5 在C程序中访问不在.bss段中定义的变量。
汇编程序:
C程序:
externfloatsine[] //声明为外部变量
float ∗sine_p=sine; //声明一个指针指向该变量
f=sine_p[4]; //作为普通数组访问sine数组
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。