理论教育 C语言和汇编语言混合编程技术

C语言和汇编语言混合编程技术

时间:2023-06-15 理论教育 版权反馈
【摘要】:C语言与汇编语言混合编程通常有如下三种方法:1)在C程序中直接嵌入汇编语句。3)C程序中访问汇编程序变量。直接在C语言程序中相应位置嵌入汇编语句,只需在汇编语句加上双引号和小括号,前面加asm标识符号,称为ASM语句。在编写独立的汇编程序时,必须注意以下几点:1)不论是用C语言编写的函数还是用汇编语言编写的函数,都必须遵循寄存器使用规则。例4-4 在C程序中访问在.bss段中定义的变量。

C语言和汇编语言混合编程技术

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数组

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈