你现在位置:首页>技术论文>电气常识>嵌入式系统>正文
关于c与汇编混合编程的一点总结
日期:2008-5-9 0:17:40 来源:本站整理  
点击: 作者:
点击【】放大字体.

在C和汇编混合编程的时候,存在C语言和汇编语言的变量以及函数的接口问题。在C程序中定义的变量,编译为.asm文件后,都被放进了.bss区,而且变量名的前面都带了一个下划线。在C程序中定义的函数,编译后在函数名前也带了一个下划线。例如:

WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

WWW_P※LCJS_CO※M-PLC-技-.术_网

extern int num就会变成 .bss _num, 1
WWW_PLCJS@_COM%-PLC-技.术_网

extern float nums[5]就会变成.bss _nums, 5
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

extern void func ( )就会变成 _func,
WWW_PLCJS_COM-PLC-技.术_网

WWW_P※LCJS_COM-PLC-)技.术_网

一 汇编和C的相互调用可以分以下几种情况:
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

(1) 汇编程序中访问c程序中的变量和函数。
WWW_PLCJS_COM-PLC-技.术_网

在汇编程序中,用_XX就可以访问C中的变量XX了。访问数组时,可以用_XX+偏移量来访问,如_XX+3访问了数组中的XX[3]。
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

WWcW_PLCJS_COM-PLC-技.术_网

    在汇编程序调用C函数时,如果没有参数传递,直接用_funcname 就可以了。如果有参数传递, 则函数中最左边的一个参数由寄存器A给出,其他的参数按顺序由堆栈给出。返回值是返回到A寄存器或者由A寄存器给出的地址。同时注意,为了能够让汇编语言能访问到C语言中定义的变量和函数,他们必须声明为外部变量,即加extern 前缀。
WWW.PLCJS.COM——可编程控制器技术门户

WWW_PLCJS_COM-PLC-技.术_网

(2) c程序中访问汇编程序中的变量
——可——编——程——控-制-器-技——术——门——户

WWW_PL※CJS_COM-PLC-技.术_网

    如果需要在c程序中访问汇编程序中的变量,则汇编程序中的变量名必须以下划线为首字符,并用global使之成为全局变量。
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

WW.W_PLC※JS_C,OM-PL,C-技.术_网

    如果需要在c程序中调用汇编程序中的过程,则过程名必须以下划线为首字符,并且,要根据c程序编译时使用的模式是stack-based model还是register argument model来正确地编写该过程,使之能正确地取得调用参数。
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

WWW_PL※CJS_COM-PLC-技.术_网

(3) 在线汇编
WWcW_PLCJS_COM-PLC-技.术_网

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

    在C程序中直接插入 asm(“ *** ”),内嵌汇编语句,需要注意的是这种用法要慎用,在线汇编提供了能直接读写硬件的能力,如读写中断控制允许寄存器等,但编译器并不检查和分析在线汇编语言,插入在线汇编语言改变汇编环境或可能改变C变量的值可能导致严重的错误。
WWW_PLCJS_COM-PLC-技.术_网

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

二 汇编和C接口中寻址方式的改变:
WWW_PLCJS@_COM%-PLC-技.术_网

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

    需要注意的是,在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位直接相加得来。
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

WW.W_PLC※JS_C,OM-PL,C-技.术_网

    由于在C语言的环境下,局部变量的寻址必须通过SP寄存器实现,在混合编程的时候,为了使汇编语言不影响堆栈寄存器SP,通常的方式是在汇编环境中使用DP方式寻址,这样可以使二者互不干扰。编程中只要注意对CPL位正确设置即可。
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

上一篇: 单片机破解的常用方法及应对策略
下一: 没有了
评论内容
载入中...
载入中...
P
L
C



|










|


P
L
C









·最新招聘信息
·最新求职信息
·推荐产品
·推荐厂商
·栏目热门排行
·站内热门排行