快捷搜索:

keil C言语与汇编言语混合编程

2、在 Project 窗口中包括 汇编代码的 C 文件上右键,选择“Options for ...”,点击右边的“Generate Assembler SRC File”

和“Assemble SRC File”,使查看 框由灰色变成黑色(有用 )状态;

3、依据 选择的编译模式,把相应的库文件(如 Small 模式时,是 Keil/C51/Lib/C51S.Lib)加入工程中, 该文件有必要 作为工程的终究 文件;

4、编译,即可生成方针 代码。

来个实例吧:

#i nclude

void main(void)

{

P2=1;

#pragma asm

MOV R7,#10

DEL:MOV R6,#20

DJNZ R6,$

DJNZ R7,DEL

#pragma endasm

P2=0;

}

2 . 无参数传递的函数调用

C51调用汇编函数

1.无参数传递的函数调用

先来个例子:其间 example.c和example.a51为项目中的两个文件

*example.c*

extern void delay100();

main()

{delay100;}

*example.a51*

?PR?DELAY100 SEGMENT CODE; // 在程序存储区中定义 段

PUBLIC DELAY100;//声明函数

RSEG ?PR?DELAY100;//函数可被连接器放置在任何当地

DELAY100:

MOV R7,#10

DEL:

MOV R6,#20

DJNZ R6,$

DJNZ R7,DEL

RET

END

在example.c文件中,先声明外部函数,然后直接在main中调用即可。

在example.a51中,

?PR?DELAY100 SEGMENT CODE; 作用是在程序存储区中定义 段,DELAY100为段名,?PR?表明 段位于程序存储区内

PUBLIC DELAY100; 作用是声明函数为公共函数

RSEG ?PR?DELAY100; 表明 函数可被连接器放置在任何当地 ,RSEG是段名的属性

段名的最初 为PR,是为了和C51内部命名转换兼容,命名转换规律如下:

CODE -?PR?

XDATA-?XD

DATA-?DT

BIT-?BI

PDATA-?PD

3. 有参数传递的函数调用

记住哦,c文件和A51文件不能使用同一个文件名,不过我还不知道为什么会这样,有高手知道得话请奉告 。

今天说说带参数传递的函数调用,在C51和汇编之间传递参数的方式有两种,一种是通过存放 器传递参数,C51中不同类型的实参会存入相应的存放 器,在汇编中只需对相应存放 器进行操作,即达到传递参数的用意。

不同类型的数据及其传递参数的存放 器如下表所示:

 在C和汇编混合编程的时分 ,存在C言语 和汇编言语 的变量以及函数的接口问题。

在C程序中定义 的变量,编译为.asm文件后,都被放进了.bss区,并且 变量名的前面都带了一个下划线。在C程序中定义 的函数,编译后在函数名前也带了一个下划线。例如:

extern int num就会变成 .bss _num, 1

extern float nums[5]就会变成.bss _nums, 5

extern void func ( )就会变成 _func,

一  汇编和C的彼此 调用可以分以下几种状况 :

(1) 汇编程序中拜访 c程序中的变量和函数。

在汇编程序中,用_XX就能够 拜访 C中的变量XX了。拜访 数组时,可以用_XX+偏移量来拜访 ,如_XX+3拜访 了数组中的XX[3]。

在汇编程序调用C函数时,假如 没有参数传递,直接用_funcname 就能够 了。假如 有参数传递, 则函数中最左面 的一个参数由存放 器A给出,其他的参数按顺序由仓库 给出。返回值是返回到A存放 器或者由A存放 器给出的地 址。同时留意 ,为了可以 让汇编言语 能拜访 到C言语 中定义 的变量和函数,他们有必要 声明为外部变量,即加extern 前缀。

(2) c程序中拜访 汇编程序中的变量

假如 需要在c程序中拜访 汇编程序中的变量,则汇编程序中的变量名有必要 以下划线为首字符,并用global使之成为全局变量

假如 需要在c程序中调用汇编程序中的过程,则过程名有必要 以下划线为首字符,并且,要依据 c程序编译时使用的模式是stack-based model仍是 register argument model来正确地编写该过程,使之能正确地取得调用参数。

(3) 在线汇编

在C程序中直接刺进 asm(“ * ”),内嵌汇编语句,需要留意 的是这种用法要慎用,在线汇编提供了能直接读写硬件的能力,如读写中断控制允许存放 器等,但编译器其实不 查看 和分析在线汇编言语 ,刺进 在线汇编言语 改变汇编环境或可能改变C变量的值可能导致严峻 的过错 。

二 汇编和C接口中寻址方式的改变:

需 要留意 的是,在C言语 中,关于 部分 变量的建立和拜访 ,是通过仓库 完成 的,它的寻址是通过仓库 存放 器SP完成 的。而在汇编言语 中,为了使程序代码变得更为精 简,TI在直接寻址方式中,地 址的低7位直接包括 在指令中,这低7位所能寻址的详细 方位 可由DP存放 器或SP存放 器抉择 。详细 完成 可通过设置ST1存放 器 的CPL位完成 ,CPL=0,DP寻址,CPL=1,SP寻址。在DP寻址的时分 ,由DP提供高9位地 址,与低7位组成16位地 址;在SP寻址的时分 , 16位地 址是由SP(16位)与低7位直接相加得来。

因为 在C言语 的环境下,部分 变量的寻址有必要 通过SP存放 器完成 ,在混合编程的时分 ,为了使汇编言语 不影响仓库 存放 器SP,通常的方式是在汇编环境中使用DP方式寻址,这样能够使 二者互不搅扰 。编程中只需 留意 对CPL位正确设置即可

1 .word 的意思就适当 与C言语 里的int,char等定义 一个变两的宽度

2. 编译过错 原因有2:

a.假如 在汇编里边 定义 .global(全局符号),那么在C言语 里边 应该用extern声明,以引用该符号。

您可能还会对下面的文章感兴趣: