打印

经典总结,C与汇编

[复制链接]
2858|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小李志|  楼主 | 2007-3-16 23:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于c与汇编混合编程的一点总结
  以前本版曾经有过这方面的**,我把自己的一点总结写出来,希望抛砖引玉,大家指点
一下!
在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寻址,C
PL=1,SP寻址。在DP寻址的时候,由DP提供高9位地址,与低7位组成16位地址;在SP寻
址的时候,16位地址是由SP(16位)与低7位直接相加得来。
由于在C语言的环境下,局部变量的寻址必须通过SP寄存器实现,在混合编程的时候,为
了使汇编语言不影响堆栈寄存器SP,通常的方式是在汇编环境中使用DP方式寻址,这样
可以使二者互不干扰。编程中只要注意对CPL位正确设置即可。

相关帖子

沙发
xwj| | 2007-3-17 00:00 | 只看该作者

不同编译器差别极大,不能一概而论

使用特权

评论回复
板凳
su_mj000| | 2007-3-17 03:33 | 只看该作者

“经典总结”---口气不小啊!

“在C语言中,对于局部变量的建立和访问,是通过堆栈实现的,它的寻址
是通过堆栈寄存器SP实现的。”--- 不能一概而论!LZ在本行业可能涉世
不深。比如象PIC16F84之类的小芯片上,没有专用的堆栈指针。更遑论使用
偏移量来存取局部变量。即使象51系列那些具有硬件堆栈的器件,也不适合用
对占来保存局部变量,其道理就不多说了。

“经典总结”---口气不小啊!

使用特权

评论回复
地板
ayb_ice| | 2007-3-17 07:55 | 只看该作者

随便说说

  不同的编译器混合编程规则都不同,甚至连基本的编译方法都不同,都不知LZ的编译器用的是什么,不知所云.

使用特权

评论回复
5
平常人| | 2007-3-17 08:37 | 只看该作者

精神可嘉,但不能以一概全。

楼主的总结还是有一定水平的,请说说你用的是什么编译器,虽然不能对所有人有帮助,至少可以对部分人有启发。

使用特权

评论回复
6
huangqi412| | 2007-3-17 08:47 | 只看该作者

先看下

使用特权

评论回复
7
xufucg| | 2014-5-16 15:26 | 只看该作者
在汇编程序调用C函数时,如果没有参数传递,直接用_funcname 就可以了。如果有
参数传递, 则函数中最左边的一个参数由寄存器A给出,其他的参数按顺序由堆栈给出


汇编调用C,进入C程序后,C程序的计算要使用到什么位置上的RAM?有具体的说明没有?怎样保护返回到汇编后,汇编程序占用的寄存器不受C运算的影响?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

151

主题

727

帖子

3

粉丝