打印

汇编与C语言混合编程的关键问题

[复制链接]
1923|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
拿起书本|  楼主 | 2013-2-8 19:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1: C程序变量与汇编程序变量的共用
为了使程序更易于接口和维护,可以在汇编程序中引用与C程序共享的变量:
.ref_to_dce_num,_to_dte_num,_to_dce_buff,_to_dte_buff
在汇编程序中引用而在C程序可直接定义的变量:
unsigned char to_dte_buff[BUFF_SIZE]; //DSP发向PC机的数据
int to_dte_num; //缓冲区中存放的有效字节数
int to_dte_store: //缓冲区的存放指针
int to_dte_read; //缓冲区的读取指针
这样经过链接就可完成对应

相关帖子

沙发
拿起书本|  楼主 | 2013-2-8 19:57 | 只看该作者
2: 程序入口问题
在C程序中,程序的入口是main()函数。而在汇编程序中其入口由*.cmd文件中的命令决定,如:-emain_start;程序入口地址为main_start。这样,混合汇编出来的程序得不到正确结果。因为C到ASM的汇编有默认的入口c-int00,从这开始的一段程序为C程序的运行做准备工作。这些工作包括初始化变量、设置栈指针等,相当于系统壳不能耐跨越。这时可在*.cmd文件中去掉语句:-e main_start。如仍想执行某些汇编程序,可以C函数的形式执行,如:
main_start(); //其中含有其他汇编程序
但前提是在汇编程序中把_main_start作为首地址,程序以rete结尾(作为可调用的函数)的程序段,并在汇编程序中引用_main_start,即.ref _main_start。

使用特权

评论回复
板凳
拿起书本|  楼主 | 2013-2-8 19:58 | 只看该作者
3: 移位问题
在C语言中把变量设为char型时,它是8位的,但在DSP汇编中此变量仍被作为16位处理。所以会出现在C程序中的移位结果与汇编程序移位结果不同的问题。解决的办法是在C程序中,把移位结果再用0X00FF去“与”一下即可。

使用特权

评论回复
地板
拿起书本|  楼主 | 2013-2-8 19:58 | 只看该作者
.4 堆栈问题
在汇编程序中对堆栈的依赖很小,但在C程序中分配局部变量、变量初始化、传递函数变量、保存函数返回地址、保护临时结果功能都是靠堆栈完成。而C编译器无法检查程序运行时堆栈能否溢出。所以应尽量多给堆栈分配空间。C编译器的默认大小为1KB。在程序不正常跑飞时应注意检查是否堆栈溢出

使用特权

评论回复
5
拿起书本|  楼主 | 2013-2-8 19:58 | 只看该作者
.5 程序跑飞问题
编译后的C程序跑飞一般是对不存在的存储区访问造成的。首先要查.MAP文件并与memery map图对比,看是否超出范围。如果在有中断的程序中跑飞,应重点查在中断程序中是否对所用到的寄存器进行了压栈保护。如果在中断程序中调用了C程序,则要查汇编后的C程序中是否用到了没有被保护的寄存器并提供保护(在C程序的编译中是不对A、B等寄存器进行保护的)。

使用特权

评论回复
6
sedatefire| | 2013-2-9 12:09 | 只看该作者
个人觉得最关键的问题是要把握好出入栈、参数传递、现场保护这些问题

使用特权

评论回复
7
simale| | 2013-11-14 16:35 | 只看该作者
拿起书本 发表于 2013-2-8 19:57
2: 程序入口问题
在C程序中,程序的入口是main()函数。而在汇编程序中其入口由*.cmd文件中的命令决定,如 ...

你好,请问你有没有DSP汇编与C语言混合编程的资料呢?网上这种资料很少。。。

使用特权

评论回复
8
angerbird| | 2013-11-16 23:46 | 只看该作者
一个面向机器的一个面向对象的

使用特权

评论回复
9
acer4736| | 2013-11-17 22:40 | 只看该作者
大学不是主修C语言的

使用特权

评论回复
10
wenjun_wang86| | 2013-11-18 08:46 | 只看该作者
楼主,在汇编中定义的变量,在C中使用,再次申明的时候要加extern吧?
int to_dte_num; //缓冲区中存放的有效字节数
应该是
extern int to_dte_num; //缓冲区中存放的有效字节数

使用特权

评论回复
11
smilingangel| | 2013-11-18 19:04 | 只看该作者
拿起书本 发表于 2013-2-8 19:58
.5 程序跑飞问题
编译后的C程序跑飞一般是对不存在的存储区访问造成的。首先要查.MAP文件并与memery map图 ...

程序跑飞是个非常头疼的问题的,这个需要仔细的分析的啦

使用特权

评论回复
12
zhangjin_comeon| | 2013-11-18 23:16 | 只看该作者
谢谢分享

使用特权

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

本版积分规则

个人签名:好好学习,天天向上!

519

主题

4194

帖子

31

粉丝